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  }