github.com/netdata/go.d.plugin@v0.58.1/pkg/prometheus/selector/expr.go (about)

     1  // SPDX-License-Identifier: GPL-3.0-or-later
     2  
     3  package selector
     4  
     5  import "fmt"
     6  
     7  type Expr struct {
     8  	Allow []string `yaml:"allow"`
     9  	Deny  []string `yaml:"deny"`
    10  }
    11  
    12  func (e Expr) Empty() bool {
    13  	return len(e.Allow) == 0 && len(e.Deny) == 0
    14  
    15  }
    16  
    17  func (e Expr) Parse() (Selector, error) {
    18  	if e.Empty() {
    19  		return nil, nil
    20  	}
    21  
    22  	var srs []Selector
    23  	var allow Selector
    24  	var deny Selector
    25  
    26  	for _, item := range e.Allow {
    27  		sr, err := Parse(item)
    28  		if err != nil {
    29  			return nil, fmt.Errorf("parse selector '%s': %v", item, err)
    30  		}
    31  		srs = append(srs, sr)
    32  	}
    33  
    34  	switch len(srs) {
    35  	case 0:
    36  		allow = trueSelector{}
    37  	case 1:
    38  		allow = srs[0]
    39  	default:
    40  		allow = Or(srs[0], srs[1], srs[2:]...)
    41  	}
    42  
    43  	srs = srs[:0]
    44  	for _, item := range e.Deny {
    45  		sr, err := Parse(item)
    46  		if err != nil {
    47  			return nil, fmt.Errorf("parse selector '%s': %v", item, err)
    48  		}
    49  		srs = append(srs, sr)
    50  	}
    51  
    52  	switch len(srs) {
    53  	case 0:
    54  		deny = falseSelector{}
    55  	case 1:
    56  		deny = srs[0]
    57  	default:
    58  		deny = Or(srs[0], srs[1], srs[2:]...)
    59  	}
    60  
    61  	return And(allow, Not(deny)), nil
    62  }