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