-
Notifications
You must be signed in to change notification settings - Fork 0
/
filter.go
38 lines (31 loc) · 1.03 KB
/
filter.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
package xre
import (
"fmt"
"regexp"
)
func scanG(s string) (Command, string, error) {
pat, s, err := scanPat(s[0], s[1:])
if err != nil {
return nil, s, err
}
return ProtoCommand{regexpFilter{pat}}, s, nil
}
func scanV(s string) (Command, string, error) {
pat, s, err := scanPat(s[0], s[1:])
if err != nil {
return nil, s, err
}
return ProtoCommand{regexpNegFilter{pat}}, s, nil
}
type regexpFilter struct{ pat *regexp.Regexp }
type regexpNegFilter regexpFilter
func (fl regexpFilter) test(buf []byte) bool { return fl.pat.Match(buf) }
func (fn regexpNegFilter) test(buf []byte) bool { return !fn.pat.Match(buf) }
func (fl regexpFilter) Create(next Processor) Processor {
return &predicateProcessor{predicate: fl, next: next}
}
func (fn regexpNegFilter) Create(next Processor) Processor {
return &predicateProcessor{predicate: fn, next: next}
}
func (fl regexpFilter) String() string { return fmt.Sprintf("g%v", regexpString(fl.pat)) }
func (fn regexpNegFilter) String() string { return fmt.Sprintf("v%v", regexpString(fn.pat)) }