diff --git a/cmd/clitest/main.go b/cmd/clitest/main.go index 523a074..a606ee8 100644 --- a/cmd/clitest/main.go +++ b/cmd/clitest/main.go @@ -7,7 +7,6 @@ import ( "log" "net/http" "os" - "path" "slices" "sort" "strings" @@ -50,43 +49,85 @@ func main() { like = append(like, ledger.LikeAfter(*likeAfter)) foo := func(w http.ResponseWriter, r *http.Request) { - switch path.Dir(r.URL.Path) { - case "/bal": - register := deltas.Like(like...).Register() - nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{} - dates := []string{} - for date, balances := range register { - dates = append(dates, date) - 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 + foolike := make(ledger.Likes, 0) + for _, v := range r.URL.Query()["likeName"] { + foolike = append(foolike, ledger.LikeName(v)) + } + for _, v := range r.URL.Query()["likeAfter"] { + foolike = append(foolike, ledger.LikeAfter(v)) + } + for _, v := range r.URL.Query()["likeBefore"] { + foolike = append(foolike, ledger.LikeBefore(v)) + } + if len(foolike) == 0 { + foolike = like + } + + register := deltas.Like(foolike...).Register() + nameCurrencyDateValue := map[string]map[ledger.Currency]map[string]float64{} + dates := []string{} + for date, balances := range register { + dates = append(dates, date) + 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 } } - slices.Sort(dates) + } + slices.Sort(dates) - line := charts.NewLine() - line.AddXAxis(dates) + line := charts.NewLine() + line.AddXAxis(dates) + + switch r.URL.Path { + default: + http.NotFound(w, r) + return + case "/bal": for name, currencyDateValue := range nameCurrencyDateValue { for currency, dateValue := range currencyDateValue { series := make([]int, len(dates)) - for i, date := range dates { - series[i] = int(dateValue[date]) + for i := range dates { + var lastValue float64 + for j := range dates[:i+1] { + if newLastValue, ok := dateValue[dates[j]]; ok { + lastValue = newLastValue + } + } + series[i] = int(lastValue) } key := fmt.Sprintf("%s (%s)", name, currency) line.AddYAxis(key, series) } } - if err := line.Render(w); err != nil { - panic(err) - } case "/reg": + for name, currencyDateValue := range nameCurrencyDateValue { + for currency, dateValue := range currencyDateValue { + series := make([]int, len(dates)) + for i := range dates { + var prevValue float64 + var lastValue float64 + for j := range dates[:i+1] { + if newLastValue, ok := dateValue[dates[j]]; ok { + prevValue = lastValue + lastValue = newLastValue + } + } + series[i] = int(lastValue - prevValue) + } + key := fmt.Sprintf("%s (%s)", name, currency) + line.AddYAxis(key, series) + } + } + } + if err := line.Render(w); err != nil { + panic(err) } }