github.com/Cloud-Foundations/Dominator@v0.3.4/lib/filter/filter.go (about) 1 package filter 2 3 import ( 4 "fmt" 5 "io" 6 "regexp" 7 8 "github.com/Cloud-Foundations/Dominator/lib/fsutil" 9 ) 10 11 func load(filename string) (*Filter, error) { 12 lines, err := fsutil.LoadLines(filename) 13 if err != nil { 14 return nil, err 15 } 16 return New(lines) 17 } 18 19 func newFilter(filterLines []string) (*Filter, error) { 20 var filter Filter 21 filter.FilterLines = make([]string, 0) 22 for _, line := range filterLines { 23 if line != "" { 24 filter.FilterLines = append(filter.FilterLines, line) 25 } 26 } 27 if err := filter.compile(); err != nil { 28 return nil, err 29 } 30 return &filter, nil 31 } 32 33 func read(reader io.Reader) (*Filter, error) { 34 lines, err := fsutil.ReadLines(reader) 35 if err != nil { 36 return nil, err 37 } 38 return New(lines) 39 } 40 41 func (filter *Filter) compile() error { 42 filter.filterExpressions = make([]*regexp.Regexp, len(filter.FilterLines)) 43 for index, reEntry := range filter.FilterLines { 44 if reEntry == "!" { 45 filter.invertMatches = true 46 continue 47 } 48 var err error 49 filter.filterExpressions[index], err = regexp.Compile("^" + reEntry) 50 if err != nil { 51 return err 52 } 53 } 54 return nil 55 } 56 57 func (filter *Filter) match(pathname string) bool { 58 if len(filter.filterExpressions) != len(filter.FilterLines) { 59 filter.compile() 60 } 61 defaultRetval := false 62 matchRetval := true 63 if filter.invertMatches { 64 defaultRetval = true 65 matchRetval = false 66 } 67 for _, regex := range filter.filterExpressions { 68 if regex != nil && regex.MatchString(pathname) { 69 return matchRetval 70 } 71 } 72 return defaultRetval 73 } 74 75 func (filter *Filter) registerStrings(registerFunc func(string)) { 76 if filter != nil { 77 for _, str := range filter.FilterLines { 78 registerFunc(str) 79 } 80 } 81 } 82 83 func (filter *Filter) replaceStrings(replaceFunc func(string) string) { 84 if filter != nil { 85 for index, str := range filter.FilterLines { 86 filter.FilterLines[index] = replaceFunc(str) 87 } 88 } 89 } 90 91 func (filter *Filter) write(writer io.Writer) error { 92 for _, line := range filter.FilterLines { 93 if _, err := fmt.Fprintln(writer, line); err != nil { 94 return err 95 } 96 } 97 return nil 98 }