package filter import ( "smesh.lol/pkg/nostr/event" "smesh.lol/pkg/lol/errorf" ) type S []*F func NewS(ff ...*F) *S { s := S(ff) return &s } func (s *S) Match(event *event.E) bool { for _, f := range *s { if f.Matches(event) { return true } } return false } func (s *S) Marshal(dst []byte) (b []byte) { if s == nil { panic("nil filter slice") } b = dst b = append(b, '[') first := false for _, f := range *s { if f == nil { continue } if first { b = append(b, ',') } else { first = true } b = f.Marshal(b) } b = append(b, ']') return } func (s *S) Unmarshal(b []byte) (r []byte, err error) { r = b if len(r) == 0 { return } isArrayWrapped := r[0] == '[' if isArrayWrapped { r = r[1:] if len(r) > 0 && r[0] == ']' { r = r[1:] return } } for { if len(r) == 0 { return } f := New() var rem []byte if rem, err = f.Unmarshal(r); err != nil { return } *s = append(*s, f) r = rem if len(r) == 0 { return } if r[0] == ',' { r = r[1:] continue } if r[0] == ']' { if isArrayWrapped { r = r[1:] } return } err = errorf.E( []byte("filters.Unmarshal: expected ',' or ']' after filter, got: %q"), r[0], ) return } } func (s *S) MatchIgnoringTimestampConstraints(ev *event.E) bool { for _, ff := range *s { if ff.MatchesIgnoringTimestampConstraints(ev) { return true } } return false }