-
Notifications
You must be signed in to change notification settings - Fork 0
/
reporter.go
102 lines (82 loc) · 1.6 KB
/
reporter.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
package multilinediff
import (
"fmt"
"strings"
"github.com/google/go-cmp/cmp"
)
type diffType int
const (
diffTypeEqual diffType = iota
diffTypeChange
diffTypeAdd
)
type diffLine struct {
diff diffType
old string
new string
}
func (l diffLine) toLine(length int) string {
line := ""
switch l.diff {
case diffTypeChange:
line += "- "
case diffTypeAdd:
line += "+ "
default:
line += " "
}
line += l.old
for i := 0; i < length-len(l.old); i++ {
line += " "
}
line += " "
line += l.new
return line
}
// A pretty reporter to pass into cmp.Diff using the cmd.Reporter function.
type Reporter struct {
LineSep string
DiffCount int
path cmp.Path
lines []diffLine
}
func (r *Reporter) PushStep(ps cmp.PathStep) {
r.path = append(r.path, ps)
}
func (r *Reporter) Report(rs cmp.Result) {
line := diffLine{}
vOld, vNew := r.path.Last().Values()
if !rs.Equal() {
r.DiffCount++
if vOld.IsValid() {
line.diff = diffTypeChange
line.old = fmt.Sprintf("%+v", vOld)
}
if vNew.IsValid() {
if line.diff == diffTypeEqual {
line.diff = diffTypeAdd
}
line.new = fmt.Sprintf("%+v", vNew)
}
} else {
line.old = fmt.Sprintf("%+v", vOld)
line.new = fmt.Sprintf("%+v", vOld)
}
r.lines = append(r.lines, line)
}
func (r *Reporter) PopStep() {
r.path = r.path[:len(r.path)-1]
}
func (r *Reporter) String() string {
maxLen := 0
for _, l := range r.lines {
if len(l.old) > maxLen {
maxLen = len(l.old)
}
}
diffLines := []string{}
for _, l := range r.lines {
diffLines = append(diffLines, l.toLine(maxLen))
}
return strings.Join(diffLines, r.LineSep)
}