package ledger import ( "bufio" "bytes" "fmt" "io" "os" "strconv" ) type BPIs string 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)) if os.IsNotExist(err) { return nil, nil } if err != nil { return nil, err } defer f.Close() result := make(map[Currency]BPI) r := bufio.NewReader(f) for { line, err := readTransactionLine(r) if len(line) > 0 { fields := bytes.Fields(line) if len(fields) > 3 { date := fields[1] 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) } return nil, fmt.Errorf("what do: %s", line) } if err == io.EOF { return result, nil } else if err != nil { return result, err } } }