A parser for the AIP-160 filter expression language implemented in Go.
The EBNF specification is https://google.aip.dev/assets/misc/ebnf-filtering.txt
This library has minor modifications to the parse tree to avoid ambiguity and simplify Visitor implementations.
import "github.com/jaqx0r/filterexpression"
...
ast, err := filterexpression.Parse(req.filter)
...Visit the AST by implementing the FilterVisitor interface.
You can embed the existing Visitor as a base, so your implementation only needs to override the methods it cares about.
type Visitor struct {
filtervisitor.Visitor
query query.Builder
}
func (v *Visitor) VisitFunction(ast *filterexpression.Function) error {
query.Function(ast.Name[0])
return nil
}
...
visitor = &Visitor{}
if err := filterexpression.Visit(ast, visitor); err != nil {
log.Errorf("Visit() failed: %v", err)
}