From 76f6cf101672467265d454bff335cdf8c87422d6 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 09:27:13 -0600 Subject: [PATCH] gziphttp --- cmd/clitest/main.go | 114 +++++++++++++++++++++++++++++--------------- go.mod | 5 ++ go.sum | 4 ++ 3 files changed, 85 insertions(+), 38 deletions(-) diff --git a/cmd/clitest/main.go b/cmd/clitest/main.go index 5e25751..0f34f80 100644 --- a/cmd/clitest/main.go +++ b/cmd/clitest/main.go @@ -4,11 +4,14 @@ import ( "encoding/json" "flag" "fmt" + "log" + "net/http" "os" "sort" "strings" "gogs.inhome.blapointe.com/ana-ledger/ledger" + "gogs.inhome.blapointe.com/local/gziphttp" ) func main() { @@ -20,6 +23,7 @@ func main() { groupName := flag.String("group-name", ".*", "grouping to apply to names") groupDate := flag.String("group-date", ".*", "grouping to apply to dates") jsonOutput := flag.Bool("json", false, "json output") + httpOutput := flag.String("http", "", "http output listen address, like :8080") flag.Parse() if flag.NArg() < 1 { @@ -48,50 +52,84 @@ func main() { like = append(like, ledger.LikeAfter(*likeAfter)) } - jsonResult := []any{} + if *httpOutput != "" { + switch *foo { + case "reg": + foo := func(w http.ResponseWriter, r *http.Request) { + register := deltas.Like(like...).Register() - switch *foo { - case "reg": - sort.Slice(deltas, func(i, j int) bool { - return deltas[i].Debug() < deltas[j].Debug() - }) - register := deltas.Register() - for i := range deltas { - if like.All(deltas[i]) { - if !*jsonOutput { - fmt.Printf("%s (%+v)\n", deltas[i].Debug(), register[deltas[i].Date][deltas[i].Name].Debug()) - } else { - jsonResult = append(jsonResult, map[string]any{ - "name": deltas[i].Name, - "delta": deltas[i], - "balance": register[deltas[i].Date][deltas[i].Name], - }) + nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{} + for date, balances := range register { + for name, balance := range balances { + for currency, value := range balance { + if _, ok := nameCurrencyDateValue[name]; !ok { + nameCurrencyDateValue[name] = make(map[ledger.Currency]map[string]float64) + } + if _, ok := nameCurrencyDateValue[name][currency]; !ok { + nameCurrencyDateValue[name][currency] = make(map[string]float64) + } + nameCurrencyDateValue[name][currency][date] += value + } + } + } + if gziphttp.Can(r) { + w = gziphttp.New(w) + } + json.NewEncoder(w).Encode(nameCurrencyDateValue) + } + log.Println("listening on", *httpOutput) + if err := http.ListenAndServe(*httpOutput, http.HandlerFunc(foo)); err != nil { + panic(err) + } + default: + panic(fmt.Errorf("not impl %q", *foo)) + } + } else { + jsonResult := []any{} + + switch *foo { + case "reg": + sort.Slice(deltas, func(i, j int) bool { + return deltas[i].Debug() < deltas[j].Debug() + }) + register := deltas.Register() + for i := range deltas { + if like.All(deltas[i]) { + if !*jsonOutput { + fmt.Printf("%s (%+v)\n", deltas[i].Debug(), register[deltas[i].Date][deltas[i].Name].Debug()) + } else { + jsonResult = append(jsonResult, map[string]any{ + "name": deltas[i].Name, + "delta": deltas[i], + "balance": register[deltas[i].Date][deltas[i].Name], + }) + } } } - } - case "bal": - deltas = deltas.Like(like...) - for k, v := range deltas.Balances() { - results := []string{} - for subk, subv := range v { - results = append(results, fmt.Sprintf("%s %.2f", subk, subv)) - } - if len(results) > 0 { - if !*jsonOutput { - fmt.Printf("%s\t%s\n", k, strings.Join(results, " + ")) - } else { - jsonResult = append(jsonResult, map[string]any{ - "name": k, - "balance": v, - }) + case "bal": + deltas = deltas.Like(like...) + for k, v := range deltas.Balances() { + results := []string{} + for subk, subv := range v { + results = append(results, fmt.Sprintf("%s %.2f", subk, subv)) + } + if len(results) > 0 { + if !*jsonOutput { + fmt.Printf("%s\t%s\n", k, strings.Join(results, " + ")) + } else { + jsonResult = append(jsonResult, map[string]any{ + "name": k, + "balance": v, + }) + } } } + default: + panic(fmt.Errorf("not impl %q", *foo)) } - default: - panic(fmt.Errorf("not impl %q", flag.Args()[0])) - } - if *jsonOutput { - json.NewEncoder(os.Stdout).Encode(jsonResult) + if *jsonOutput { + json.NewEncoder(os.Stdout).Encode(jsonResult) + } } } diff --git a/go.mod b/go.mod index 3ad49a2..659a098 100644 --- a/go.mod +++ b/go.mod @@ -1,3 +1,8 @@ module gogs.inhome.blapointe.com/ana-ledger go 1.21.1 + +require ( + github.com/go-echarts/go-echarts/v2 v2.3.1 // indirect + gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc // indirect +) diff --git a/go.sum b/go.sum index e69de29..d9930d5 100644 --- a/go.sum +++ b/go.sum @@ -0,0 +1,4 @@ +github.com/go-echarts/go-echarts/v2 v2.3.1 h1:Yw0HVjVTxpYm48l974dMjRzx8ni2ql0kKi/kawSgxFE= +github.com/go-echarts/go-echarts/v2 v2.3.1/go.mod h1:56YlvzhW/a+du15f3S2qUGNDfKnFOeJSThBIrVFHDtI= +gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc h1:ayxolpOV9uIm8rGdmtz03d5JlnbSmFF8daKjmwrZZ1o= +gogs.inhome.blapointe.com/local/gziphttp v0.0.0-20230508014052-4ccd700640fc/go.mod h1:Sdj/NB9h3xrzPDqViQAHoDhA5gmpHkrWRXUauvLSA74=