From 012024ac66941289b65a3fb935666e36b0440e8b Mon Sep 17 00:00:00 2001 From: Bel LaPointe <153096461+breel-render@users.noreply.github.com> Date: Fri, 13 Dec 2024 09:48:24 -0700 Subject: [PATCH] i need fsm --- cmd/cli/main.go | 6 ++++ cmd/cli/query.go | 76 ++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 82 insertions(+) create mode 100644 cmd/cli/query.go diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 2d58e77..4ab66ed 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -40,6 +40,12 @@ func Main() { } cmd := positional[0] + q, err := BuildQuery(positional) + if err != nil { + panic(err) + } + panic(q) + likePattern := "" notLikePattern := "" i := 1 diff --git a/cmd/cli/query.go b/cmd/cli/query.go new file mode 100644 index 0000000..a1b2f73 --- /dev/null +++ b/cmd/cli/query.go @@ -0,0 +1,76 @@ +package cli + +import ( + "fmt" + "io" + + "gogs.inhome.blapointe.com/ana-ledger/src/ledger" +) + +type Query struct{} + +func BuildQuery(args args) (ledger.Like, error) { + likes := make(ledger.Likes, 0) + + for _, ok := args.peek(); ok; _, ok = args.peek() { + like, err := buildOneQuery(args) + if err != nil { + return nil, err + } + likes = append(likes, like) + } + + return likes.Any, nil +} + +func buildOneQuery(args args) (ledger.Like, error) { + word, ok := args.peek() + if !ok { + return nil, io.EOF + } + + likes := make(ledger.Likes, 0) + + for _, ok := args.peek(); ok; _, ok = args.peek() { + switch word { + case "and": + if len(likes) == 0 { + return nil, fmt.Errorf("and without predicate") + } + args.pop() + like, err := buildOneQuery(args) + if err != nil { + return nil, err + } + likes = append(likes, like) + case "not": + args.pop() + like, err := buildOneQuery(args) + if err != nil { + return nil, err + } + likes = append(likes, like) + default: + return nil, io.EOF + if next, _ := args.peek(); next != "and" { + return likes.All, nil + } + } + } + return nil, io.EOF +} + +type args []string + +func (args *args) pop() string { + first := (*args)[0] + *args = (*args)[1:] + return first +} + +func (args *args) peek() (string, bool) { + if len(*args) == 0 { + return "", false + } + return (*args)[0], true +}