diff --git a/cmd/cli/config.go b/cmd/cli/config.go new file mode 100644 index 0000000..9b8d9f8 --- /dev/null +++ b/cmd/cli/config.go @@ -0,0 +1,11 @@ +package cli + +type Config struct { + Files FileList + Query struct { + Period string + Sort string + NoRounding bool + Depth int + } +} diff --git a/cmd/cli/flag.go b/cmd/cli/flag.go new file mode 100644 index 0000000..9fa1d0e --- /dev/null +++ b/cmd/cli/flag.go @@ -0,0 +1,35 @@ +package cli + +import ( + "fmt" + "os" + "strings" +) + +type FlagStringArray []string + +func (array *FlagStringArray) String() string { + return strings.Join(*array, ", ") +} + +func (array *FlagStringArray) Set(s string) error { + *array = append(*array, s) + return nil +} + +type FileList FlagStringArray + +func (fileList FileList) Strings() []string { + return ([]string)(fileList) +} + +func (fileList *FileList) String() string { + return (*FlagStringArray)(fileList).String() +} + +func (fileList *FileList) Set(s string) error { + if _, err := os.Stat(s); os.IsNotExist(err) { + return fmt.Errorf("file does not exist: %s", s) + } + return (*FlagStringArray)(fileList).Set(s) +} diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 8743f24..5dbc846 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -3,11 +3,86 @@ package cli import ( "flag" "os" + "slices" + + "gogs.inhome.blapointe.com/ana-ledger/src/ledger" ) func Main() { + var config Config + fs := flag.NewFlagSet(os.Args[0], flag.ContinueOnError) + fs.Var(&config.Files, "f", "paths to files") + fs.StringVar(&config.Query.Period, "period", "", "period") + fs.StringVar(&config.Query.Sort, "S", "", "sort ie date") + fs.BoolVar(&config.Query.NoRounding, "no-rounding", false, "no rounding") + fs.IntVar(&config.Query.Depth, "depth", 0, "depth grouping") if err := fs.Parse(os.Args[1:]); err != nil { panic(err) } + + files := config.Files.Strings() + if len(files) == 0 { + panic("must specify at least one file") + } + ledgerFiles, err := ledger.NewFiles(files[0], files[1:]...) + if err != nil { + panic(err) + } + + positional := fs.Args() + if len(positional) == 0 || len(positional[0]) < 3 { + panic("positional arguments required, ie bal|reg PATTERN MATCHING") + } + cmd := positional[0] + + likes := []ledger.Like{} + for _, query := range positional[1:] { + panic(query) + } + + deltas, err := ledgerFiles.Deltas(likes...) + if err != nil { + panic(err) + } + + if depth := config.Query.Depth; depth > 0 { + panic(depth) + } + + switch cmd[:3] { + case "bal": + balances := deltas.Balances() + + keys := []string{} + for k := range balances { + keys = append(keys, k) + } + slices.Sort(keys) + + depth := 0 + previous := "" + for i := range keys { + key := keys[i] + + if isSameDepth := func() bool { + return false + }(); isSameDepth { + } else if isDeeper := func() bool { + return false + }(); isDeeper { + } else if lessDeep := func() int { + return 0 + }(); true { + } + + previous = key + } + + panic(balances.Debug()) + case "reg": + // register := deltas.Register() + default: + panic("unknown command " + positional[0]) + } }