github.com/netdata/go.d.plugin@v0.58.1/pkg/matcher/simple_patterns.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package matcher
     4  
     5  import (
     6  	"strings"
     7  )
     8  
     9  type (
    10  	simplePatternTerm struct {
    11  		matcher  Matcher
    12  		positive bool
    13  	}
    14  
    15  	// simplePatternsMatcher patterns.
    16  	simplePatternsMatcher []simplePatternTerm
    17  )
    18  
    19  // NewSimplePatternsMatcher creates new simple patterns. It returns error in case one of patterns has bad syntax.
    20  func NewSimplePatternsMatcher(expr string) (Matcher, error) {
    21  	var ps simplePatternsMatcher
    22  
    23  	for _, pattern := range strings.Fields(expr) {
    24  		if err := ps.add(pattern); err != nil {
    25  			return nil, err
    26  		}
    27  	}
    28  	if len(ps) == 0 {
    29  		return FALSE(), nil
    30  	}
    31  	return ps, nil
    32  }
    33  
    34  func (m *simplePatternsMatcher) add(term string) error {
    35  	p := simplePatternTerm{}
    36  	if term[0] == '!' {
    37  		p.positive = false
    38  		term = term[1:]
    39  	} else {
    40  		p.positive = true
    41  	}
    42  	matcher, err := NewGlobMatcher(term)
    43  	if err != nil {
    44  		return err
    45  	}
    46  
    47  	p.matcher = matcher
    48  	*m = append(*m, p)
    49  
    50  	return nil
    51  }
    52  
    53  func (m simplePatternsMatcher) Match(b []byte) bool {
    54  	return m.MatchString(string(b))
    55  }
    56  
    57  // MatchString matches.
    58  func (m simplePatternsMatcher) MatchString(line string) bool {
    59  	for _, p := range m {
    60  		if p.matcher.MatchString(line) {
    61  			return p.positive
    62  		}
    63  	}
    64  	return false
    65  }