diff --git a/cmd/cli/main.go b/cmd/cli/main.go index 6940090..9348c38 100644 --- a/cmd/cli/main.go +++ b/cmd/cli/main.go @@ -3,6 +3,8 @@ package cli import ( "flag" "fmt" + "io" + "maps" "os" "slices" @@ -85,32 +87,67 @@ func Main() { balances = balances.NotLike(notLikePattern) } - keys := []string{} - for k := range balances { - keys = append(keys, k) - } - slices.Sort(keys) - - max := 0 - for _, k := range keys { - if n := len(k); n > max { - max = n - } - } - - format := fmt.Sprintf("%%-%ds\t%%s%%.2f\n", max) - for _, key := range keys { - for currency, v := range balances[key] { - if currency != "$" { - currency += " " - } - fmt.Printf(format, key, currency, v) - } - } + FPrintBalances(os.Stdout, balances) case "reg": - // register := deltas.Register() - panic(cmd) + register := deltas.Register() + if likePattern != "" { + register = register.Like(likePattern) + } + if notLikePattern != "" { + register = register.NotLike(notLikePattern) + } + + var prev ledger.Balances + for _, date := range register.Dates() { + balances := register[date] + + newBalances := make(ledger.Balances) + for k, v := range balances { + if got := prev[k]; !maps.Equal(v, got) { + newBalances[k] = v + } + } + + if len(newBalances) > 0 { + fmt.Println(date) + FPrintBalances(os.Stdout, newBalances) + } + + prev = balances + } default: panic("unknown command " + positional[0]) } } + +func FPrintBalances(w io.Writer, balances ledger.Balances) { + keys := []string{} + for k := range balances { + keys = append(keys, k) + } + slices.Sort(keys) + + max := 0 + for _, k := range keys { + if n := len(k); n > max { + max = n + } + } + + format := fmt.Sprintf("%%-%ds\t%%s%%.2f\n", max) + for _, key := range keys { + currencies := []ledger.Currency{} + for currency := range balances[key] { + currencies = append(currencies, currency) + } + slices.Sort(currencies) + + for _, currency := range currencies { + printableCurrency := currency + if printableCurrency != "$" { + printableCurrency += " " + } + fmt.Fprintf(w, format, key, printableCurrency, balances[key][currency]) + } + } +} diff --git a/src/ledger/register.go b/src/ledger/register.go index a72cec6..9f771af 100644 --- a/src/ledger/register.go +++ b/src/ledger/register.go @@ -51,6 +51,26 @@ func (register Register) Names() []string { return result } +func (register Register) Like(pattern string) Register { + result := make(Register) + for k, v := range register { + if got := v.Like(pattern); len(got) > 0 { + result[k] = got + } + } + return result +} + +func (register Register) NotLike(pattern string) Register { + result := make(Register) + for k, v := range register { + if got := v.NotLike(pattern); len(got) > 0 { + result[k] = got + } + } + return result +} + func (register Register) Dates() []string { result := make([]string, 0, len(register)) for k := range register {