108 lines
1.7 KiB
Go
108 lines
1.7 KiB
Go
package filters
|
|
|
|
import (
|
|
"realy.lol/event"
|
|
"realy.lol/filter"
|
|
)
|
|
|
|
type T struct {
|
|
F []*filter.T
|
|
}
|
|
|
|
func Make(l no) *T { return &T{F: make([]*filter.T, l)} }
|
|
|
|
func (f *T) GetFingerprints() (fps []uint64, err er) {
|
|
for _, ff := range f.F {
|
|
var fp uint64
|
|
if fp, err = ff.Fingerprint(); chk.E(err) {
|
|
continue
|
|
}
|
|
fps = append(fps, fp)
|
|
}
|
|
return
|
|
}
|
|
|
|
func (f *T) Len() no { return len(f.F) }
|
|
|
|
func New(ff ...*filter.T) (f *T) { return &T{F: ff} }
|
|
|
|
func (f *T) Match(event *event.T) bo {
|
|
for _, f := range f.F {
|
|
if f.Matches(event) {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
func (f *T) String() (s st) { return st(f.Marshal(nil)) }
|
|
|
|
func (f *T) Marshal(dst by) (b by) {
|
|
var err er
|
|
_ = err
|
|
b = dst
|
|
b = append(b, '[')
|
|
end := len(f.F) - 1
|
|
for i := range f.F {
|
|
b = f.F[i].Marshal(b)
|
|
if i < end {
|
|
b = append(b, ',')
|
|
}
|
|
}
|
|
b = append(b, ']')
|
|
return
|
|
}
|
|
|
|
func (f *T) Unmarshal(b by) (r by, err er) {
|
|
r = b[:]
|
|
if len(r) < 1 {
|
|
err = errorf.E("cannot unmarshal nothing")
|
|
return
|
|
}
|
|
for len(r) > 0 {
|
|
switch r[0] {
|
|
case '[':
|
|
if len(r) > 1 && r[1] == ']' {
|
|
r = r[1:]
|
|
return
|
|
}
|
|
r = r[1:]
|
|
ffa := filter.New()
|
|
if r, err = ffa.Unmarshal(r); chk.E(err) {
|
|
return
|
|
}
|
|
f.F = append(f.F, ffa)
|
|
// continue
|
|
case ',':
|
|
r = r[1:]
|
|
if len(r) > 1 && r[1] == ']' {
|
|
r = r[1:]
|
|
return
|
|
}
|
|
ffa := filter.New()
|
|
if r, err = ffa.Unmarshal(r); chk.E(err) {
|
|
return
|
|
}
|
|
f.F = append(f.F, ffa)
|
|
// next
|
|
case ']':
|
|
r = r[1:]
|
|
// the end
|
|
return
|
|
}
|
|
}
|
|
return
|
|
}
|
|
|
|
func GenFilters(n no) (ff *T, err er) {
|
|
ff = &T{}
|
|
for _ = range n {
|
|
var f *filter.T
|
|
if f, err = filter.GenFilter(); chk.E(err) {
|
|
return
|
|
}
|
|
ff.F = append(ff.F, f)
|
|
}
|
|
return
|
|
}
|