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