mirror of
https://github.com/eolinker/apinto
synced 2025-09-26 21:01:19 +08:00
74 lines
1.3 KiB
Go
74 lines
1.3 KiB
Go
package strategy
|
|
|
|
import (
|
|
"github.com/eolinker/apinto/checker"
|
|
"github.com/eolinker/eosc/eocontext"
|
|
)
|
|
|
|
type FilterConfig map[string][]string
|
|
|
|
func ParseFilter(config FilterConfig) (IFilter, error) {
|
|
fs := make(Filters, 0, len(config))
|
|
for name, patterns := range config {
|
|
|
|
if len(patterns) == 0 {
|
|
continue
|
|
}
|
|
cks := make([]checker.Checker, 0, len(patterns))
|
|
OuterLoop:
|
|
for _, p := range patterns {
|
|
switch name {
|
|
case "ip":
|
|
c, err := newIPChecker(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cks = append(cks, c)
|
|
case "time":
|
|
c, err := newTimestampChecker(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
cks = append(cks, c)
|
|
default:
|
|
c, err := checker.Parse(p)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
if c.CheckType() == checker.CheckTypeAll {
|
|
cks = nil
|
|
break OuterLoop
|
|
}
|
|
cks = append(cks, c)
|
|
}
|
|
|
|
}
|
|
|
|
if len(cks) != 0 {
|
|
fs = append(fs, &FilterItem{
|
|
Handler: checker.NewMultipleChecker(cks),
|
|
name: name,
|
|
})
|
|
}
|
|
}
|
|
|
|
return fs, nil
|
|
}
|
|
|
|
type FilterItem struct {
|
|
checker.Handler
|
|
name string
|
|
}
|
|
type Filters []*FilterItem
|
|
|
|
func (fs Filters) Check(ctx eocontext.EoContext) bool {
|
|
vs := ctx.Labels()
|
|
for _, f := range fs {
|
|
v, has := vs[f.name]
|
|
if !f.Check(v, has) {
|
|
return false
|
|
}
|
|
}
|
|
return true
|
|
}
|