...
1 package match
2
3 import "fmt"
4
5 type AnyOf struct {
6 Matchers Matchers
7 }
8
9 func NewAnyOf(m ...Matcher) AnyOf {
10 return AnyOf{Matchers(m)}
11 }
12
13 func (self *AnyOf) Add(m Matcher) error {
14 self.Matchers = append(self.Matchers, m)
15 return nil
16 }
17
18 func (self AnyOf) Match(s string) bool {
19 for _, m := range self.Matchers {
20 if m.Match(s) {
21 return true
22 }
23 }
24
25 return false
26 }
27
28 func (self AnyOf) Index(s string) (int, []int) {
29 index := -1
30
31 segments := acquireSegments(len(s))
32 for _, m := range self.Matchers {
33 idx, seg := m.Index(s)
34 if idx == -1 {
35 continue
36 }
37
38 if index == -1 || idx < index {
39 index = idx
40 segments = append(segments[:0], seg...)
41 continue
42 }
43
44 if idx > index {
45 continue
46 }
47
48
49 segments = appendMerge(segments, seg)
50 }
51
52 if index == -1 {
53 releaseSegments(segments)
54 return -1, nil
55 }
56
57 return index, segments
58 }
59
60 func (self AnyOf) Len() (l int) {
61 l = -1
62 for _, m := range self.Matchers {
63 ml := m.Len()
64 switch {
65 case l == -1:
66 l = ml
67 continue
68
69 case ml == -1:
70 return -1
71
72 case l != ml:
73 return -1
74 }
75 }
76
77 return
78 }
79
80 func (self AnyOf) String() string {
81 return fmt.Sprintf("<any_of:[%s]>", self.Matchers)
82 }
83
View as plain text