gziphttp
parent
747dc90e9b
commit
76f6cf1016
|
|
@ -4,11 +4,14 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"flag"
|
"flag"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"net/http"
|
||||||
"os"
|
"os"
|
||||||
"sort"
|
"sort"
|
||||||
"strings"
|
"strings"
|
||||||
|
|
||||||
"gogs.inhome.blapointe.com/ana-ledger/ledger"
|
"gogs.inhome.blapointe.com/ana-ledger/ledger"
|
||||||
|
"gogs.inhome.blapointe.com/local/gziphttp"
|
||||||
)
|
)
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
|
|
@ -20,6 +23,7 @@ func main() {
|
||||||
groupName := flag.String("group-name", ".*", "grouping to apply to names")
|
groupName := flag.String("group-name", ".*", "grouping to apply to names")
|
||||||
groupDate := flag.String("group-date", ".*", "grouping to apply to dates")
|
groupDate := flag.String("group-date", ".*", "grouping to apply to dates")
|
||||||
jsonOutput := flag.Bool("json", false, "json output")
|
jsonOutput := flag.Bool("json", false, "json output")
|
||||||
|
httpOutput := flag.String("http", "", "http output listen address, like :8080")
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
|
|
||||||
if flag.NArg() < 1 {
|
if flag.NArg() < 1 {
|
||||||
|
|
@ -48,50 +52,84 @@ func main() {
|
||||||
like = append(like, ledger.LikeAfter(*likeAfter))
|
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 {
|
nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{}
|
||||||
case "reg":
|
for date, balances := range register {
|
||||||
sort.Slice(deltas, func(i, j int) bool {
|
for name, balance := range balances {
|
||||||
return deltas[i].Debug() < deltas[j].Debug()
|
for currency, value := range balance {
|
||||||
})
|
if _, ok := nameCurrencyDateValue[name]; !ok {
|
||||||
register := deltas.Register()
|
nameCurrencyDateValue[name] = make(map[ledger.Currency]map[string]float64)
|
||||||
for i := range deltas {
|
}
|
||||||
if like.All(deltas[i]) {
|
if _, ok := nameCurrencyDateValue[name][currency]; !ok {
|
||||||
if !*jsonOutput {
|
nameCurrencyDateValue[name][currency] = make(map[string]float64)
|
||||||
fmt.Printf("%s (%+v)\n", deltas[i].Debug(), register[deltas[i].Date][deltas[i].Name].Debug())
|
}
|
||||||
} else {
|
nameCurrencyDateValue[name][currency][date] += value
|
||||||
jsonResult = append(jsonResult, map[string]any{
|
}
|
||||||
"name": deltas[i].Name,
|
}
|
||||||
"delta": deltas[i],
|
}
|
||||||
"balance": register[deltas[i].Date][deltas[i].Name],
|
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":
|
||||||
case "bal":
|
deltas = deltas.Like(like...)
|
||||||
deltas = deltas.Like(like...)
|
for k, v := range deltas.Balances() {
|
||||||
for k, v := range deltas.Balances() {
|
results := []string{}
|
||||||
results := []string{}
|
for subk, subv := range v {
|
||||||
for subk, subv := range v {
|
results = append(results, fmt.Sprintf("%s %.2f", subk, subv))
|
||||||
results = append(results, fmt.Sprintf("%s %.2f", subk, subv))
|
}
|
||||||
}
|
if len(results) > 0 {
|
||||||
if len(results) > 0 {
|
if !*jsonOutput {
|
||||||
if !*jsonOutput {
|
fmt.Printf("%s\t%s\n", k, strings.Join(results, " + "))
|
||||||
fmt.Printf("%s\t%s\n", k, strings.Join(results, " + "))
|
} else {
|
||||||
} else {
|
jsonResult = append(jsonResult, map[string]any{
|
||||||
jsonResult = append(jsonResult, map[string]any{
|
"name": k,
|
||||||
"name": k,
|
"balance": v,
|
||||||
"balance": v,
|
})
|
||||||
})
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("not impl %q", *foo))
|
||||||
}
|
}
|
||||||
default:
|
|
||||||
panic(fmt.Errorf("not impl %q", flag.Args()[0]))
|
|
||||||
}
|
|
||||||
|
|
||||||
if *jsonOutput {
|
if *jsonOutput {
|
||||||
json.NewEncoder(os.Stdout).Encode(jsonResult)
|
json.NewEncoder(os.Stdout).Encode(jsonResult)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
5
go.mod
5
go.mod
|
|
@ -1,3 +1,8 @@
|
||||||
module gogs.inhome.blapointe.com/ana-ledger
|
module gogs.inhome.blapointe.com/ana-ledger
|
||||||
|
|
||||||
go 1.21.1
|
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
|
||||||
|
)
|
||||||
|
|
|
||||||
4
go.sum
4
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=
|
||||||
Loading…
Reference in New Issue