mirror of
https://github.com/nadoo/glider.git
synced 2025-04-22 04:02:07 +08:00
39 lines
867 B
Go
39 lines
867 B
Go
package matcher
|
|
|
|
import (
|
|
"github.com/nadoo/glider/rule/internal/trie"
|
|
"strconv"
|
|
"strings"
|
|
)
|
|
|
|
type CIDRMatcher trie.Trie
|
|
|
|
// TODO: ipv6
|
|
func NewCIDRMatcher(CIDRs []string) *CIDRMatcher {
|
|
dict := make([]string, 0, len(CIDRs))
|
|
for _, CIDR := range CIDRs {
|
|
grp := strings.SplitN(CIDR, "/", 2)
|
|
if len(grp) == 1 {
|
|
grp = append(grp, "32")
|
|
}
|
|
l, _ := strconv.Atoi(grp[1])
|
|
arr := strings.Split(grp[0], ".")
|
|
var builder strings.Builder
|
|
for _, sec := range arr {
|
|
itg, _ := strconv.Atoi(sec)
|
|
tmp := strconv.FormatInt(int64(itg), 2)
|
|
builder.WriteString(strings.Repeat("0", 8-len(tmp)))
|
|
builder.WriteString(tmp)
|
|
if builder.Len() >= l {
|
|
break
|
|
}
|
|
}
|
|
dict = append(dict, builder.String()[:l])
|
|
}
|
|
return (*CIDRMatcher)(trie.New(dict))
|
|
}
|
|
|
|
func (m CIDRMatcher) Match(t interface{}) bool {
|
|
return (*trie.Trie)(&m).Match(t.(string)) != ""
|
|
}
|