...
1 package apidiff
2
3 import (
4 "bytes"
5 "fmt"
6 "io"
7 )
8
9
10 type Report struct {
11 Changes []Change
12 }
13
14
15 type Change struct {
16 Message string
17 Compatible bool
18 }
19
20 func (r Report) messages(compatible bool) []string {
21 var msgs []string
22 for _, c := range r.Changes {
23 if c.Compatible == compatible {
24 msgs = append(msgs, c.Message)
25 }
26 }
27 return msgs
28 }
29
30 func (r Report) String() string {
31 var buf bytes.Buffer
32 if err := r.Text(&buf); err != nil {
33 return fmt.Sprintf("!!%v", err)
34 }
35 return buf.String()
36 }
37
38 func (r Report) Text(w io.Writer) error {
39 if err := r.TextIncompatible(w, true); err != nil {
40 return err
41 }
42 return r.TextCompatible(w)
43 }
44
45 func (r Report) TextIncompatible(w io.Writer, withHeader bool) error {
46 if withHeader {
47 return r.writeMessages(w, "Incompatible changes:", r.messages(false))
48 }
49 return r.writeMessages(w, "", r.messages(false))
50 }
51
52 func (r Report) TextCompatible(w io.Writer) error {
53 return r.writeMessages(w, "Compatible changes:", r.messages(true))
54 }
55
56 func (r Report) writeMessages(w io.Writer, header string, msgs []string) error {
57 if len(msgs) == 0 {
58 return nil
59 }
60 if header != "" {
61 if _, err := fmt.Fprintf(w, "%s\n", header); err != nil {
62 return err
63 }
64 }
65 for _, m := range msgs {
66 if _, err := fmt.Fprintf(w, "- %s\n", m); err != nil {
67 return err
68 }
69 }
70 return nil
71 }
72
View as plain text