From f2ec1233d712fffb76eb9f8e7e34999f2e58fac1 Mon Sep 17 00:00:00 2001 From: Bel LaPointe Date: Wed, 25 Oct 2023 13:44:46 -0600 Subject: [PATCH] impl NewBPIs(path)[currency].Get(date) --- ledger/bpi.go | 34 +++++++++++++++++++++------------- ledger/bpi_test.go | 12 ++++++++++++ 2 files changed, 33 insertions(+), 13 deletions(-) diff --git a/ledger/bpi.go b/ledger/bpi.go index c8e00df..b460ab8 100644 --- a/ledger/bpi.go +++ b/ledger/bpi.go @@ -3,24 +3,17 @@ package ledger import ( "bufio" "bytes" - "fmt" "io" "os" "strconv" ) -type BPIs string +type BPIs map[Currency]BPI type BPI map[string]float64 func NewBPIs(p string) (BPIs, error) { - bpis := BPIs(p) - _, err := bpis.values() - return bpis, err -} - -func (bpis BPIs) values() (map[Currency]BPI, error) { - f, err := os.Open(string(bpis)) + f, err := os.Open(p) if os.IsNotExist(err) { return nil, nil } @@ -37,15 +30,17 @@ func (bpis BPIs) values() (map[Currency]BPI, error) { if len(line) > 0 { fields := bytes.Fields(line) if len(fields) > 3 { - date := fields[1] - currency := fields[len(fields)-2] + date := string(fields[1]) + currency := Currency(fields[len(fields)-2]) value, err := strconv.ParseFloat(string(fields[len(fields)-1][1:]), 64) if err != nil { return nil, err } - return nil, fmt.Errorf("what do with %s/%s/%.2f?", date, currency, value) + if _, ok := result[currency]; !ok { + result[currency] = make(BPI) + } + result[currency][date] = value } - return nil, fmt.Errorf("what do: %s", line) } if err == io.EOF { return result, nil @@ -54,3 +49,16 @@ func (bpis BPIs) values() (map[Currency]BPI, error) { } } } + +func (bpi BPI) Lookup(date string) float64 { + var closestWithoutGoingOver string + for k := range bpi { + if k <= date && k > closestWithoutGoingOver { + closestWithoutGoingOver = k + } + } + if closestWithoutGoingOver == "" { + return 0 + } + return bpi[closestWithoutGoingOver] +} diff --git a/ledger/bpi_test.go b/ledger/bpi_test.go index 7a7a437..6137b50 100644 --- a/ledger/bpi_test.go +++ b/ledger/bpi_test.go @@ -157,5 +157,17 @@ P 2023-10-22 07:33:56 GME $17.18 t.Fatal(err) } + if got := got["USDC"].Lookup("2099-01-01"); got != 0 { + t.Error("default got != 0:", got) + } + if got := got["GME"].Lookup("2099-01-01"); got != 17.18 { + t.Errorf("shouldve returned latest but got %v", got) + } + if got := got["GME"].Lookup("2023-09-19"); got != 18.22 { + t.Errorf("shouldve returned one day before but got %v", got) + } + if got := got["GME"].Lookup("2023-09-18"); got != 18.22 { + t.Errorf("shouldve returned day of but got %v", got) + } t.Log(got) }