forked from MetaCubeX/geo
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsing.go
58 lines (51 loc) · 1.43 KB
/
sing.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
package geosite
import (
"regexp"
"github.com/metacubex/geo/encoding/singgeo"
"github.com/sagernet/sing/common/domain"
)
func loadSing(reader *singgeo.GeoSiteReader, codes []string) (db *Database, err error) {
db = &Database{
matchers: make(map[string]*domain.Matcher, len(codes)),
domainKeyword: make(map[string][]string, len(codes)),
domainRegex: make(map[string][]*regexp.Regexp, len(codes)),
SourceType: TypeSing,
CodeCount: len(codes),
}
var rules []singgeo.Item
for _, code := range codes {
rules, err = reader.Read(code)
if err != nil {
return nil, err
}
var (
domainFull []string
domainSuffix []string
domainKeyword []string
domainRegex []*regexp.Regexp
)
for _, rule := range rules {
switch rule.Type {
case singgeo.RuleTypeDomain:
domainFull = append(domainFull, rule.Value)
case singgeo.RuleTypeDomainSuffix:
domainSuffix = append(domainSuffix, rule.Value)
case singgeo.RuleTypeDomainKeyword:
domainKeyword = append(domainKeyword, rule.Value)
case singgeo.RuleTypeDomainRegex:
var re *regexp.Regexp
re, err = regexp.Compile(rule.Value)
if err != nil {
return nil, err
}
domainRegex = append(domainRegex, re)
}
}
if len(domainFull)+len(domainSuffix) > 0 {
db.matchers[code] = domain.NewMatcher(domainFull, domainSuffix)
}
db.domainKeyword[code] = domainKeyword
db.domainRegex[code] = domainRegex
}
return db, nil
}