summaryrefslogtreecommitdiffstats
path: root/dependencies/pkg/mod/golang.org/x/exp@v0.0.0-20220613132600-b0d781184e0d/apidiff/report.go
blob: ce79e2790a0124463b3e8794f673f55216b5bce8 (plain)
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
package apidiff

import (
	"bytes"
	"fmt"
	"io"
)

// Report describes the changes detected by Changes.
type Report struct {
	Changes []Change
}

// A Change describes a single API change.
type Change struct {
	Message    string
	Compatible bool
}

func (r Report) messages(compatible bool) []string {
	var msgs []string
	for _, c := range r.Changes {
		if c.Compatible == compatible {
			msgs = append(msgs, c.Message)
		}
	}
	return msgs
}

func (r Report) String() string {
	var buf bytes.Buffer
	if err := r.Text(&buf); err != nil {
		return fmt.Sprintf("!!%v", err)
	}
	return buf.String()
}

func (r Report) Text(w io.Writer) error {
	if err := r.TextIncompatible(w, true); err != nil {
		return err
	}
	return r.TextCompatible(w)
}

func (r Report) TextIncompatible(w io.Writer, withHeader bool) error {
	if withHeader {
		return r.writeMessages(w, "Incompatible changes:", r.messages(false))
	}
	return r.writeMessages(w, "", r.messages(false))
}

func (r Report) TextCompatible(w io.Writer) error {
	return r.writeMessages(w, "Compatible changes:", r.messages(true))
}

func (r Report) writeMessages(w io.Writer, header string, msgs []string) error {
	if len(msgs) == 0 {
		return nil
	}
	if header != "" {
		if _, err := fmt.Fprintf(w, "%s\n", header); err != nil {
			return err
		}
	}
	for _, m := range msgs {
		if _, err := fmt.Fprintf(w, "- %s\n", m); err != nil {
			return err
		}
	}
	return nil
}