-
Notifications
You must be signed in to change notification settings - Fork 65
/
filter.go
72 lines (61 loc) · 1.87 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
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
/*
Copyright 2021 The Flux authors
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*/
package policy
import (
"fmt"
"regexp"
)
// RegexFilter represents a regular expression filter
type RegexFilter struct {
filtered map[string]string
Regexp *regexp.Regexp
Replace string
}
// NewRegexFilter constructs new RegexFilter object
func NewRegexFilter(pattern string, replace string) (*RegexFilter, error) {
m, err := regexp.Compile(pattern)
if err != nil {
return nil, fmt.Errorf("invalid regular expression pattern '%s': %w", pattern, err)
}
return &RegexFilter{
Regexp: m,
Replace: replace,
}, nil
}
// Apply will construct the filtered list of tags based on the provided list of tags
func (f *RegexFilter) Apply(list []string) {
f.filtered = map[string]string{}
for _, item := range list {
if submatches := f.Regexp.FindStringSubmatchIndex(item); len(submatches) > 0 {
tag := item
if f.Replace != "" {
result := []byte{}
result = f.Regexp.ExpandString(result, f.Replace, item, submatches)
tag = string(result)
}
f.filtered[tag] = item
}
}
}
// Items returns the list of filtered tags
func (f *RegexFilter) Items() []string {
var filtered []string
for k := range f.filtered {
filtered = append(filtered, k)
}
return filtered
}
// GetOriginalTag returns the original tag before replace extraction
func (f *RegexFilter) GetOriginalTag(tag string) string {
return f.filtered[tag]
}