package main import ( "time" "github.com/alecthomas/participle/v2" "github.com/alecthomas/participle/v2/lexer" ) var basicLexer = lexer.MustSimple([]lexer.SimpleRule{ {"Identifier", `[a-z][a-zA-Z0-9_]*`}, {"Date", `\d{4}-\d{2}-\d{2}`}, {"Time", `\d{2}:\d{2}:\d{2}`}, {"Int", `\d+`}, {"T", `T`}, {"Z", `Z`}, {"Whitespace", `[ ]+`}, }) var parser = participle.MustBuild[Atom]( participle.Lexer(basicLexer), participle.Elide("Whitespace"), participle.UseLookahead(2), ) 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 }