-
Notifications
You must be signed in to change notification settings - Fork 0
/
parser.go
105 lines (89 loc) · 1.96 KB
/
parser.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
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package gocdp
import (
"regexp"
"strings"
)
type TrimOperator int
const (
OrOperator TrimOperator = iota
AndOperator
)
type Parser interface {
Parse(input string) (CDResults, error)
CanParse(input string) bool
CanTransform() bool
Transform(input string, filtered []interface{}) (string, error)
}
type TrimOptions struct {
maxResults int
filters []func(CDResult) bool
operator TrimOperator
}
type TrimOption func(*TrimOptions)
func WithMaxResults(max int) TrimOption {
return func(o *TrimOptions) {
o.maxResults = max
}
}
func WithFilterRedirect(regexes ...string) TrimOption {
return func(o *TrimOptions) {
o.filters = append(o.filters, func(c CDResult) bool {
for _, re := range regexes {
match, _ := regexp.MatchString(re, c.Redirect)
if match {
return true
}
}
return false
})
}
}
func WithFilterURL(regexes ...string) TrimOption {
return func(o *TrimOptions) {
o.filters = append(o.filters, func(c CDResult) bool {
for _, re := range regexes {
match, _ := regexp.MatchString(re, c.Url)
if match {
return true
}
}
return false
})
}
}
func WithFilterContentType(contentTypes ...string) TrimOption {
return func(o *TrimOptions) {
o.filters = append(o.filters, func(c CDResult) bool {
for _, contentType := range contentTypes {
if strings.EqualFold(c.ContentType, contentType) {
return true
}
}
return false
})
}
}
func WithFilterStatus(statusCodes ...int) TrimOption {
return func(o *TrimOptions) {
o.filters = append(o.filters, func(c CDResult) bool {
return c.IsStatus(statusCodes...)
})
}
}
func WithFilterLength(lengths ...int) TrimOption {
return func(o *TrimOptions) {
o.filters = append(o.filters, func(c CDResult) bool {
for _, length := range lengths {
if c.ContentLength == length {
return true
}
}
return false
})
}
}
func WithFilterOperator(op TrimOperator) TrimOption {
return func(o *TrimOptions) {
o.operator = op
}
}