package main import ( "time" "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" ) var basicLexer = lexer.MustSimple([]lexer.SimpleRule{ {"Identifier", `[a-zA-Z_][a-zA-Z0-9_]*`}, {"Date", `\d{4}-\d{2}-\d{2}`}, {"Timestamp", `\d{4}-\d{2}-\d{2}T?\d{2}:\d{2}:\d{2}Z?`}, {"Time", `\d{2}:\d{2}:\d{2}Z?`}, {"Int", `\d+`}, {"Whitespace", `[ ]+`}, }) var parser = participle.MustBuild[Atom]( participle.Lexer(basicLexer), participle.Elide("Whitespace"), ) func Parse(expr string) (TimeResult, error) { res, err := parser.ParseString("expr", expr) if err != nil { return nil, err } return res, nil } type TimeResult interface { Time() (time.Time, error) RequiresRefreshing() bool }