-
Notifications
You must be signed in to change notification settings - Fork 1
/
log.go
72 lines (62 loc) · 1.6 KB
/
log.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
64
65
66
67
68
69
70
71
72
package godiff
import (
"encoding/json"
)
type (
//ChangeLog represents a change log
ChangeLog struct {
Changes []*Change
}
)
//Size returns change log size
func (l *ChangeLog) Size() int {
return len(l.Changes)
}
//Add adds change log
func (l *ChangeLog) Add(change *Change) {
l.Changes = append(l.Changes, change)
}
//AddError adds an error
func (l *ChangeLog) AddError(path *Path, err error) {
if err == nil {
return
}
l.Add(&Change{Path: path, Error: err.Error()})
}
//AddCreate adds create change
func (l *ChangeLog) AddCreate(path *Path, value interface{}) {
l.Add(&Change{Type: ChangeTypeCreate, Path: path, To: value})
}
//AddDelete adds delete change
func (l *ChangeLog) AddDelete(path *Path, value interface{}) {
l.Add(&Change{Type: ChangeTypeDelete, Path: path, From: value})
}
//AddUpdate adds update change
func (l *ChangeLog) AddUpdate(path *Path, from, to interface{}) {
l.Add(&Change{Type: ChangeTypeUpdate, Path: path, From: from, To: to})
}
//ToChangeRecords converts changeLog to change records
func (l *ChangeLog) ToChangeRecords(source, id, userID string) []*ChangeRecord {
var result []*ChangeRecord
for _, change := range l.Changes {
result = append(result, &ChangeRecord{
Source: source,
SourceID: id,
UserID: userID,
Path: change.Path.String(),
Change: string(change.Type),
From: change.From,
To: change.To,
})
}
return result
}
//String stringify change
func (l *ChangeLog) String() string {
if len(l.Changes) == 0 {
return ""
}
records := l.ToChangeRecords("", "", "")
result, _ := json.Marshal(records)
return string(result)
}