in internal/wildcard/matcher.go [67:125]
func (m *Matcher) Match(s string) bool {
if len(m.parts) == 0 && !m.wildcardBegin && !m.wildcardEnd {
return s == ""
}
if len(m.parts) == 1 && !m.wildcardBegin && !m.wildcardEnd {
if m.caseSensitive {
return s == m.parts[0]
}
return len(s) == len(m.parts[0]) && hasPrefixLower(s, m.parts[0]) == 0
}
parts := m.parts
if !m.wildcardEnd && len(parts) > 0 {
part := parts[len(parts)-1]
if m.caseSensitive {
if !strings.HasSuffix(s, part) {
return false
}
} else {
if len(s) < len(part) {
return false
}
if hasPrefixLower(s[len(s)-len(part):], part) != 0 {
return false
}
}
parts = parts[:len(parts)-1]
}
for i, part := range parts {
j := -1
if m.caseSensitive {
if i > 0 || m.wildcardBegin {
j = strings.Index(s, part)
} else {
if !strings.HasPrefix(s, part) {
return false
}
j = 0
}
} else {
off := 0
for j == -1 && len(s)-off >= len(part) {
skip := hasPrefixLower(s[off:], part)
if skip == 0 {
j = off
} else {
if i == 0 && !m.wildcardBegin {
return false
}
off += skip
}
}
}
if j == -1 {
return false
}
s = s[j+len(part):]
}
return true
}