in confgenerator/filter/internal/ast/ast.go [341:397]
func NewRestriction(lhs, operator, rhs Attrib) (*Restriction, error) {
var r Restriction
switch operator := operator.(type) {
case string:
r.Operator = operator
case *token.Token:
r.Operator = string(operator.Lit)
default:
return nil, fmt.Errorf("unknown operator: %v", operator)
}
switch lhs := lhs.(type) {
case Target:
// Eager validation
if err := lhs.checkValidCharacters(); err != nil {
// TODO: Unnecessary, but preserved until we drop fluent-bit.
return nil, err
}
_, err := lhs.RecordAccessor()
if err != nil {
_, err := lhs.OTTLAccessor()
if err != nil {
return nil, err
}
}
r.LHS = lhs
default:
return nil, fmt.Errorf("unknown lhs: %v", lhs)
}
switch rhs := rhs.(type) {
case nil:
case Target:
// BNF parses values as Target, even if they are singular
if len(rhs) != 1 {
return nil, fmt.Errorf("unexpected rhs: %v", rhs)
}
// Perform the appropriate unquoting depending on what operator is being used.
switch r.Operator {
case "=~", "!~":
rhs := rhs[0]
// Regular expressions must be string, not text, and we need to preserve the original escaped text for the regex engine.
if rhs[0] != byte('"') || rhs[len(rhs)-1] != byte('"') {
return nil, fmt.Errorf("regular expressions must begin and end with '\"', token %q", rhs)
}
r.RHS = rhs[1 : len(rhs)-1]
default:
rhs, err := UnquoteTextOrString(rhs[0])
if err != nil {
return nil, err
}
r.RHS = rhs
}
default:
return nil, fmt.Errorf("unknown rhs: %v", rhs)
}
return &r, nil
}