impl updating ledger file batch and single by idx
parent
612c3f0b7e
commit
eaad03281c
29
ledger.go
29
ledger.go
|
|
@ -7,6 +7,7 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"os"
|
"os"
|
||||||
|
"path"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Ledger struct {
|
type Ledger struct {
|
||||||
|
|
@ -23,6 +24,34 @@ func NewLedger(path string) (Ledger, error) {
|
||||||
}, err
|
}, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ledger Ledger) SetTransaction(i int, transaction Transaction) error {
|
||||||
|
transactions, err := ledger.Transactions()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
if i >= len(transactions) {
|
||||||
|
return errors.New("i too high")
|
||||||
|
}
|
||||||
|
transactions[i] = transaction
|
||||||
|
return ledger.SetTransactions(transactions)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (ledger Ledger) SetTransactions(transactions []Transaction) error {
|
||||||
|
f, err := ioutil.TempFile(os.TempDir(), path.Base(ledger.path)+".*")
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
for _, transaction := range transactions {
|
||||||
|
if _, err := fmt.Fprintf(f, "%s\n", transaction.Marshal()); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if err := f.Close(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return os.Rename(f.Name(), ledger.path)
|
||||||
|
}
|
||||||
|
|
||||||
func (ledger Ledger) Transactions() ([]Transaction, error) {
|
func (ledger Ledger) Transactions() ([]Transaction, error) {
|
||||||
f, err := ledger.open()
|
f, err := ledger.open()
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,14 @@
|
||||||
package main
|
package main
|
||||||
|
|
||||||
import "testing"
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"path"
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/google/uuid"
|
||||||
|
)
|
||||||
|
|
||||||
func TestLedgerTransactions(t *testing.T) {
|
func TestLedgerTransactions(t *testing.T) {
|
||||||
ledger, err := NewLedger("./testdata/ledger.dat")
|
ledger, err := NewLedger("./testdata/ledger.dat")
|
||||||
|
|
@ -36,3 +44,56 @@ func TestLedgerTransactions(t *testing.T) {
|
||||||
t.Logf("%+v => \n%s", transactions[i], transactions[i].Marshal())
|
t.Logf("%+v => \n%s", transactions[i], transactions[i].Marshal())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func TestLedgerSetTransaction(t *testing.T) {
|
||||||
|
aTransaction := func() Transaction {
|
||||||
|
return Transaction{
|
||||||
|
Date: "2021-07-20",
|
||||||
|
Description: uuid.New().String(),
|
||||||
|
Payee: "payee",
|
||||||
|
Payer: "payer",
|
||||||
|
Amount: 1.23,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
path := path.Join(t.TempDir(), "ledger.dat")
|
||||||
|
a, err := os.Open("./testdata/ledger.dat")
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
b, err := os.Create(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
if _, err := io.Copy(b, a); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
a.Close()
|
||||||
|
b.Close()
|
||||||
|
|
||||||
|
ledger, err := NewLedger(path)
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
transactions, err := ledger.Transactions()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
was := fmt.Sprintf("%+v", transactions)
|
||||||
|
transactions[0] = aTransaction()
|
||||||
|
want := fmt.Sprintf("%+v", transactions)
|
||||||
|
if err := ledger.SetTransaction(0, transactions[0]); err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
transactions, err = ledger.Transactions()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
got := fmt.Sprintf("%+v", transactions)
|
||||||
|
if got == was {
|
||||||
|
t.Fatal(got)
|
||||||
|
}
|
||||||
|
if got != want {
|
||||||
|
t.Fatal(want, got)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue