Parse parses one selector expression.
(expr string)
| 16 | |
| 17 | // Parse parses one selector expression. |
| 18 | func Parse(expr string) (Selector, error) { |
| 19 | terms, err := splitSelectorTerms(unsugarExpr(expr)) |
| 20 | if err != nil { |
| 21 | return nil, err |
| 22 | } |
| 23 | |
| 24 | srs := make([]Selector, 0, len(terms)) |
| 25 | for _, term := range terms { |
| 26 | sr, err := parseSelector(term) |
| 27 | if err != nil { |
| 28 | return nil, err |
| 29 | } |
| 30 | srs = append(srs, sr) |
| 31 | } |
| 32 | |
| 33 | switch len(srs) { |
| 34 | case 0: |
| 35 | return nil, nil |
| 36 | case 1: |
| 37 | return srs[0], nil |
| 38 | default: |
| 39 | return And(srs[0], srs[1], srs[2:]...), nil |
| 40 | } |
| 41 | } |
| 42 | |
| 43 | func parseSelector(line string) (Selector, error) { |
| 44 | sub := reLV.FindStringSubmatch(strings.TrimSpace(line)) |
searching dependent graphs…