...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 package pretty
19
20 import (
21 "fmt"
22 "os"
23 "os/exec"
24 "syscall"
25 )
26
27
28
29
30
31
32
33
34
35 func Diff(want, got interface{}) (string, bool, error) {
36 fname1, err := writeToTemp(want)
37 if err != nil {
38 return "", false, err
39 }
40 defer os.Remove(fname1)
41
42 fname2, err := writeToTemp(got)
43 if err != nil {
44 return "", false, err
45 }
46 defer os.Remove(fname2)
47
48 cmd := exec.Command("diff", "-u", "--label=want", "--label=got", fname1, fname2)
49 out, err := cmd.Output()
50 if err == nil {
51 return string(out), true, nil
52 }
53 eerr, ok := err.(*exec.ExitError)
54 if !ok {
55 return "", false, err
56 }
57 ws, ok := eerr.Sys().(syscall.WaitStatus)
58 if !ok {
59 return "", false, err
60 }
61 if ws.ExitStatus() != 1 {
62 return "", false, err
63 }
64
65 return string(out), false, nil
66 }
67
68 func writeToTemp(v interface{}) (string, error) {
69 f, err := os.CreateTemp("", "prettyDiff")
70 if err != nil {
71 return "", err
72 }
73 if _, err := fmt.Fprintf(f, "%+v\n", Value(v)); err != nil {
74 return "", err
75 }
76 if err := f.Close(); err != nil {
77 return "", err
78 }
79 return f.Name(), nil
80 }
81
View as plain text