forked from mirror/glob
71 lines
938 B
Go
71 lines
938 B
Go
|
package match
|
||
|
|
||
|
import (
|
||
|
"strings"
|
||
|
"fmt"
|
||
|
)
|
||
|
|
||
|
|
||
|
|
||
|
// composite
|
||
|
type Composite struct {
|
||
|
Chunks []Matcher
|
||
|
}
|
||
|
|
||
|
|
||
|
func (self Composite) Kind() Kind {
|
||
|
return KindComposite
|
||
|
}
|
||
|
|
||
|
func (self Composite) Search(s string) (i int, l int, ok bool) {
|
||
|
if self.Match(s) {
|
||
|
return 0, len(s), true
|
||
|
}
|
||
|
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func m(chunks []Matcher, s string) bool {
|
||
|
var prev Matcher
|
||
|
for _, c := range chunks {
|
||
|
if c.Kind() == KindRaw {
|
||
|
i, l, ok := c.Search(s)
|
||
|
if !ok {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
if prev != nil {
|
||
|
if !prev.Match(s[:i]) {
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
prev = nil
|
||
|
}
|
||
|
|
||
|
s = s[i+l:]
|
||
|
continue
|
||
|
}
|
||
|
|
||
|
prev = c
|
||
|
}
|
||
|
|
||
|
if prev != nil {
|
||
|
return prev.Match(s)
|
||
|
}
|
||
|
|
||
|
return len(s) == 0
|
||
|
}
|
||
|
|
||
|
func (self Composite) Match(s string) bool {
|
||
|
return m(self.Chunks, s)
|
||
|
}
|
||
|
|
||
|
func (self Composite) String() string {
|
||
|
var l []string
|
||
|
for _, c := range self.Chunks {
|
||
|
l = append(l, fmt.Sprint(c))
|
||
|
}
|
||
|
|
||
|
return fmt.Sprintf("[composite:%s]", strings.Join(l, ","))
|
||
|
}
|