diff --git a/ledger/file.go b/ledger/file.go index cdc3d99..4e150f9 100644 --- a/ledger/file.go +++ b/ledger/file.go @@ -1,6 +1,12 @@ package ledger -import "io" +import ( + "fmt" + "io" + "os" +) + +var filesAppendDelim = "\t" type Files []string @@ -11,7 +17,42 @@ func NewFiles(p string, q ...string) (Files, error) { } func (files Files) Add(payee string, delta Delta) error { - // TODO + currencyValue := fmt.Sprintf("%s%.2f", delta.Currency, delta.Value) + if delta.Currency != USD { + currencyValue = fmt.Sprintf("%.2f %s", delta.Value, delta.Currency) + } + return files.append(fmt.Sprintf("%s %s\n%s%s%s%s\n%s%s", + delta.Date, delta.Description, + filesAppendDelim, delta.Name, filesAppendDelim+filesAppendDelim+filesAppendDelim, currencyValue, + filesAppendDelim, payee, + )) +} + +func (files Files) append(s string) error { + if err := files.trimTrainlingWhitespace(); err != nil { + return err + } + + f, err := os.OpenFile(string(files[0]), os.O_APPEND|os.O_CREATE|os.O_WRONLY, os.ModePerm) + if err != nil { + return err + } + defer f.Close() + + fmt.Fprintf(f, "\n%s", s) + return f.Close() +} + +func (files Files) trimTrainlingWhitespace() error { + f, err := os.Open(string(files[0])) + if os.IsNotExist(err) { + return nil + } + if err != nil { + return err + } + defer f.Close() + return io.EOF } diff --git a/ledger/file_test.go b/ledger/file_test.go index f32f797..c9eebd1 100644 --- a/ledger/file_test.go +++ b/ledger/file_test.go @@ -8,6 +8,7 @@ import ( ) func TestFileAdd(t *testing.T) { + filesAppendDelim = " " payee := "name:3" delta := Delta{ Date: "2999-88-77", @@ -22,15 +23,17 @@ func TestFileAdd(t *testing.T) { }{ "no file": { given: nil, - want: `2999-88-77 66 - name:1 $2.00 - name:3`, + want: ` +2999-88-77 66 + name:1 $2.00 + name:3`, }, "empty file": { given: []byte{}, - want: `2999-88-77 66 - name:1 $2.00 - name:3`, + want: ` +2999-88-77 66 + name:1 $2.00 + name:3`, }, "happy without trailing whitespace": { given: []byte(` @@ -41,9 +44,9 @@ func TestFileAdd(t *testing.T) { 2000-01-02 desc name:1 $1.00 name:2 $-1.00 -2999-88-77 66 - name:1 $2.00 - name:3`, +2999-88-77 66 + name:1 $2.00 + name:3`, }, "happy with trailing newline": { given: []byte(` @@ -55,9 +58,9 @@ func TestFileAdd(t *testing.T) { 2000-01-02 desc name:1 $1.00 name:2 $-1.00 -2999-88-77 66 - name:1 $2.00 - name:3`, +2999-88-77 66 + name:1 $2.00 + name:3`, }, }