Blame vendor/github.com/gobwas/glob/match/row.go
|
Packit |
63bb0d |
package match
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
import (
|
|
Packit |
63bb0d |
"fmt"
|
|
Packit |
63bb0d |
)
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
type Row struct {
|
|
Packit |
63bb0d |
Matchers Matchers
|
|
Packit |
63bb0d |
RunesLength int
|
|
Packit |
63bb0d |
Segments []int
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func NewRow(len int, m ...Matcher) Row {
|
|
Packit |
63bb0d |
return Row{
|
|
Packit |
63bb0d |
Matchers: Matchers(m),
|
|
Packit |
63bb0d |
RunesLength: len,
|
|
Packit |
63bb0d |
Segments: []int{len},
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) matchAll(s string) bool {
|
|
Packit |
63bb0d |
var idx int
|
|
Packit |
63bb0d |
for _, m := range self.Matchers {
|
|
Packit |
63bb0d |
length := m.Len()
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
var next, i int
|
|
Packit |
63bb0d |
for next = range s[idx:] {
|
|
Packit |
63bb0d |
i++
|
|
Packit |
63bb0d |
if i == length {
|
|
Packit |
63bb0d |
break
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
if i < length || !m.Match(s[idx:idx+next+1]) {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
idx += next + 1
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
return true
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) lenOk(s string) bool {
|
|
Packit |
63bb0d |
var i int
|
|
Packit |
63bb0d |
for range s {
|
|
Packit |
63bb0d |
i++
|
|
Packit |
63bb0d |
if i > self.RunesLength {
|
|
Packit |
63bb0d |
return false
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return self.RunesLength == i
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) Match(s string) bool {
|
|
Packit |
63bb0d |
return self.lenOk(s) && self.matchAll(s)
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) Len() (l int) {
|
|
Packit |
63bb0d |
return self.RunesLength
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) Index(s string) (int, []int) {
|
|
Packit |
63bb0d |
for i := range s {
|
|
Packit |
63bb0d |
if len(s[i:]) < self.RunesLength {
|
|
Packit |
63bb0d |
break
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
if self.matchAll(s[i:]) {
|
|
Packit |
63bb0d |
return i, self.Segments
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
return -1, nil
|
|
Packit |
63bb0d |
}
|
|
Packit |
63bb0d |
|
|
Packit |
63bb0d |
func (self Row) String() string {
|
|
Packit |
63bb0d |
return fmt.Sprintf("<row_%d:[%s]>", self.RunesLength, self.Matchers)
|
|
Packit |
63bb0d |
}
|