Skip to content

Commit 41246c9

Browse files
committed
Adding report format
1 parent 3d05325 commit 41246c9

File tree

5 files changed

+98
-5
lines changed

5 files changed

+98
-5
lines changed

config.go

+5-3
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,18 @@ import (
1010

1111
type config struct {
1212
diff.Output
13-
ignore patterns
14-
lhsFile string
15-
rhsFile string
13+
ignore patterns
14+
lhsFile string
15+
rhsFile string
16+
outputReport bool
1617
}
1718

1819
func readConfig() config {
1920
var c config
2021

2122
flag.StringVar(&c.Output.Indent, "indent", " ", "indent string")
2223
flag.BoolVar(&c.Output.ShowTypes, "show-types", false, "show types")
24+
flag.BoolVar(&c.outputReport, "report", false, "output report format")
2325
flag.Var(&c.ignore, "ignore", "paths to ignore (glob)")
2426
flag.Parse()
2527

diff/diff_test.go

+40
Original file line numberDiff line numberDiff line change
@@ -404,6 +404,46 @@ func TestIgnore(t *testing.T) {
404404
}
405405
}
406406

407+
func TestReport(t *testing.T) {
408+
want := []string{
409+
"content",
410+
"type",
411+
}
412+
413+
d, err := Diff(
414+
map[string]interface{}{
415+
"match": 5,
416+
"content": 6,
417+
"type": 8,
418+
},
419+
map[string]interface{}{
420+
"match": 5,
421+
"content": 7,
422+
"type": 9.0,
423+
},
424+
)
425+
if err != nil {
426+
t.Errorf("Diff(...): unexpected error: %s", err)
427+
return
428+
}
429+
errs, err := Report(d, testOutput)
430+
if err != nil {
431+
t.Errorf("Report(Diff(...), %+v): unexpected error: %s", err, testOutput)
432+
return
433+
}
434+
435+
if len(errs) != len(want) {
436+
t.Errorf("len(Report(Diff(...), %+v)) = %d, expected %d", testOutput, len(errs), len(want))
437+
return
438+
}
439+
440+
for i, e := range errs {
441+
if !strings.Contains(e.Error(), want[i]) {
442+
t.Errorf("Report(Diff(...), %+v)[%d] = %q, should contain %q", testOutput, i, e.Error(), want[i])
443+
}
444+
}
445+
}
446+
407447
func testStrings(context string, t *testing.T, test stringTest, ss []string, indented string) {
408448
for i, want := range test.Want {
409449
s := ss[i]

diff/map.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -180,7 +180,18 @@ func (m Map) StringIndent(keyprefix, prefix string, conf Output) string {
180180
}
181181

182182
func (m Map) Walk(path string, fn WalkFn) error {
183-
for k, diff := range m.Diffs {
183+
var keys []interface{}
184+
185+
for k := range m.Diffs {
186+
keys = append(keys, k)
187+
}
188+
189+
sort.Slice(keys, func(i, j int) bool {
190+
return strings.Compare(fmt.Sprintf("%v", keys[i]), fmt.Sprintf("%v", keys[j])) == -1
191+
})
192+
193+
for _, k := range keys {
194+
diff := m.Diffs[k]
184195
err := walk(m, diff, fmt.Sprintf("%s.%v", path, k), fn)
185196
if err != nil {
186197
return err

diff/report.go

+29
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
package diff
2+
3+
type ReportError string
4+
5+
func (e ReportError) Error() string {
6+
return string(e)
7+
}
8+
9+
func Report(d Differ, outConf Output) ([]error, error) {
10+
var errs []error
11+
12+
err := Walk(d, func(parent, diff Differ, path string) error {
13+
switch diff.Diff() {
14+
case Identical:
15+
return nil
16+
case TypesDiffer:
17+
errs = append(errs, ReportError(diff.StringIndent(" "+path+": ", "", outConf)))
18+
case ContentDiffer:
19+
if _, ok := diff.(Walker); ok {
20+
return nil
21+
}
22+
errs = append(errs, ReportError(diff.StringIndent(" "+path+": ", "", outConf)))
23+
}
24+
25+
return nil
26+
})
27+
28+
return errs, err
29+
}

main.go

+12-1
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,18 @@ func main() {
3030

3131
err = pruneIgnore(d, conf.ignore)
3232

33-
fmt.Println(d.StringIndent("", "", conf.Output))
33+
if conf.outputReport {
34+
errs, err := diff.Report(d, conf.Output)
35+
if err != nil {
36+
fmt.Fprintf(os.Stderr, "Error: Failed to generate report: %s", err)
37+
os.Exit(StatusDiffError)
38+
}
39+
for _, e := range errs {
40+
fmt.Println(e.Error())
41+
}
42+
} else {
43+
fmt.Println(d.StringIndent("", "", conf.Output))
44+
}
3445
if d.Diff() != diff.Identical {
3546
os.Exit(StatusDiffMismatch)
3647
}

0 commit comments

Comments
 (0)