glider/rule/internal/matcher/domainMatcher.go
2020-12-04 18:49:11 +08:00

47 lines
958 B
Go

package matcher
import "strings"
type SuffixDomainTree map[string]interface{}
func NewSuffixDomainTree(domains []string) *SuffixDomainTree {
var (
tree = make(map[string]interface{})
m = tree
ok bool
)
for _, d := range domains {
m = tree
fields := strings.Split(d, ".")
for i := len(fields) - 1; i >= 0; i-- {
var t interface{}
if t, ok = m[fields[i]]; ok {
m = t.(map[string]interface{})
} else {
m[fields[i]] = make(map[string]interface{})
m = m[fields[i]].(map[string]interface{})
}
}
m[".end"] = struct{}{}
}
return (*SuffixDomainTree)(&tree)
}
func (m SuffixDomainTree) Match(t interface{}) bool {
fields := strings.Split(t.(string), ".")
mm := m
for i := len(fields) - 1; i >= 0; i-- {
var tt interface{}
var ok bool
if tt, ok = mm[fields[i]]; ok {
mm = tt.(map[string]interface{})
if _, ok := mm[".end"]; ok {
return true
}
} else {
return false
}
}
return false
}