Files
realy/filters/filters.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
}