1package match 2 3import ( 4 "fmt" 5 "strings" 6 "unicode/utf8" 7 8 sutil "github.com/gobwas/glob/util/strings" 9) 10 11type PrefixAny struct { 12 Prefix string 13 Separators []rune 14} 15 16func NewPrefixAny(s string, sep []rune) PrefixAny { 17 return PrefixAny{s, sep} 18} 19 20func (self PrefixAny) Index(s string) (int, []int) { 21 idx := strings.Index(s, self.Prefix) 22 if idx == -1 { 23 return -1, nil 24 } 25 26 n := len(self.Prefix) 27 sub := s[idx+n:] 28 i := sutil.IndexAnyRunes(sub, self.Separators) 29 if i > -1 { 30 sub = sub[:i] 31 } 32 33 seg := acquireSegments(len(sub) + 1) 34 seg = append(seg, n) 35 for i, r := range sub { 36 seg = append(seg, n+i+utf8.RuneLen(r)) 37 } 38 39 return idx, seg 40} 41 42func (self PrefixAny) Len() int { 43 return lenNo 44} 45 46func (self PrefixAny) Match(s string) bool { 47 if !strings.HasPrefix(s, self.Prefix) { 48 return false 49 } 50 return sutil.IndexAnyRunes(s[len(self.Prefix):], self.Separators) == -1 51} 52 53func (self PrefixAny) String() string { 54 return fmt.Sprintf("<prefix_any:%s![%s]>", self.Prefix, string(self.Separators)) 55} 56