about summary refs log tree commit diff
path: root/tools/monzo_ynab/monzo/serde.go
blob: a38585eca6321bba5d1620379e1f0e6507d84093 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
// 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)
}