5add8ddc13
Optimizing is difficult: I like flat hierarchies because I don't like directory-hopping, but I also would like a cleaner root for my mono-repo. Bombs away! Well it's that time again, folks: spring cleaning! Here I am musing about a few things that bother me: - Should I use kebab-case or snake_case? - It feels ~confusing to have //tools and //utils. What a //projects? Isn't everything a project? *sigh*
82 lines
3.1 KiB
Go
82 lines
3.1 KiB
Go
// This package hosts the serialization and deserialization logic for all of the
|
|
// data types with which our application interacts from the Monzo API.
|
|
package main
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"time"
|
|
)
|
|
|
|
type TxMetadata struct {
|
|
FasterPayment string `json:"faster_payment"`
|
|
FpsPaymentId string `json:"fps_payment_id"`
|
|
Insertion string `json:"insertion"`
|
|
Notes string `json:"notes"`
|
|
Trn string `json:"trn"`
|
|
}
|
|
|
|
type TxCounterparty struct {
|
|
AccountNumber string `json:"account_number"`
|
|
Name string `json:"name"`
|
|
SortCode string `json:"sort_code"`
|
|
UserId string `json:"user_id"`
|
|
}
|
|
|
|
type Transaction struct {
|
|
Id string `json:"id"`
|
|
Created time.Time `json:"created"`
|
|
Description string `json:"description"`
|
|
Amount int `json:"amount"`
|
|
Currency string `json:"currency"`
|
|
Notes string `json:"notes"`
|
|
Metadata TxMetadata
|
|
AccountBalance int `json:"account_balance"`
|
|
International interface{} `json:"international"`
|
|
Category string `json:"category"`
|
|
IsLoad bool `json:"is_load"`
|
|
Settled time.Time `json:"settled"`
|
|
LocalAmount int `json:"local_amount"`
|
|
LocalCurrency string `json:"local_currency"`
|
|
Updated time.Time `json:"updated"`
|
|
AccountId string `json:"account_id"`
|
|
UserId string `json:"user_id"`
|
|
Counterparty TxCounterparty `json:"counterparty"`
|
|
Scheme string `json:"scheme"`
|
|
DedupeId string `json:"dedupe_id"`
|
|
Originator bool `json:"originator"`
|
|
IncludeInSpending bool `json:"include_in_spending"`
|
|
CanBeExcludedFromBreakdown bool `json:"can_be_excluded_from_breakdown"`
|
|
CanBeMadeSubscription bool `json:"can_be_made_subscription"`
|
|
CanSplitTheBill bool `json:"can_split_the_bill"`
|
|
CanAddToTab bool `json:"can_add_to_tab"`
|
|
AmountIsPending bool `json:"amount_is_pending"`
|
|
// Fees interface{} `json:"fees"`
|
|
// Merchant interface `json:"merchant"`
|
|
// Labels interface{} `json:"labels"`
|
|
// Attachments interface{} `json:"attachments"`
|
|
// Categories interface{} `json:"categories"`
|
|
}
|
|
|
|
// Attempts to encode a Monzo transaction struct into a string.
|
|
func serializeTx(tx *Transaction) (string, error) {
|
|
x, err := json.Marshal(tx)
|
|
return string(x), err
|
|
}
|
|
|
|
// Attempts to parse a string encoding a transaction presumably sent from a
|
|
// Monzo server.
|
|
func deserializeTx(x string) (*Transaction, error) {
|
|
target := &Transaction{}
|
|
err := json.Unmarshal([]byte(x), target)
|
|
return target, err
|
|
}
|
|
|
|
func main() {
|
|
b, _ := ioutil.ReadFile("./fixture.json")
|
|
tx := string(b)
|
|
target, _ := deserializeTx(tx)
|
|
out, _ := serializeTx(target)
|
|
fmt.Println(out)
|
|
}
|