-
Notifications
You must be signed in to change notification settings - Fork 0
/
book_json.go
63 lines (49 loc) · 1.09 KB
/
book_json.go
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
package notes
import (
"encoding/json"
"fmt"
"sort"
)
type bookJSON struct {
CurID int `json:"cur_id,omitempty"`
Notes []*Note `json:"notes,omitempty"`
}
// MarshalJSON returns the JSON encoding of the book.
func (book *Book) MarshalJSON() ([]byte, error) {
if book == nil {
return nil, fmt.Errorf("book is nil")
}
key := make([]int, 0, len(book.notes))
for k := range book.notes {
key = append(key, k)
}
notes := make([]*Note, 0, len(book.notes))
for _, k := range key {
notes = append(notes, book.notes[k])
}
sort.Slice(notes, func(i, j int) bool {
return notes[i].ID() < notes[j].ID()
})
b := bookJSON{
CurID: book.curID,
Notes: notes,
}
return json.Marshal(b)
}
// UnmarshalJSON parses the JSON-encoded data and
// stores the result in the book.
func (book *Book) UnmarshalJSON(data []byte) error {
if book == nil {
return fmt.Errorf("book is nil")
}
b := &bookJSON{}
if err := json.Unmarshal(data, b); err != nil {
return err
}
book.curID = b.CurID
book.notes = map[int]*Note{}
for _, n := range b.Notes {
book.notes[n.ID()] = n
}
return nil
}