Files
ordoor/internal/data/accounting.go

58 lines
978 B
Go
Raw Normal View History

package data
import (
"bytes"
"errors"
2019-12-31 01:55:58 +00:00
"code.ur.gs/lupine/ordoor/internal/util/asciiscan"
)
// Comments are `//`, start of line only, for accounting
var (
comment = []byte("//")
)
type Accounting map[string]string
func LoadAccounting(filename string) (Accounting, error) {
s, err := asciiscan.New(filename)
if err != nil {
return nil, err
}
defer s.Close()
scanLines := s.Bufio()
out := make(Accounting)
for scanLines.Scan() {
if err := parse(out, scanLines.Bytes()); err != nil {
return nil, err
}
}
if err := scanLines.Err(); err != nil {
return nil, err
}
return out, nil
}
func parse(into Accounting, line []byte) error {
if len(line) == 0 || bytes.Equal(line[0:2], comment) {
return nil
}
idx := bytes.Index(line, []byte("="))
key := string(line[0:idx])
value := string(bytes.Trim(line[idx+1:len(line)], "\t\r\n"))
if _, ok := into[key]; ok {
return errors.New("Duplicate key: " + key)
}
into[key] = value
return nil
}