1// Copyright 2019 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package apidiff
6
7import (
8	"bytes"
9	"fmt"
10	"io"
11)
12
13// Report describes the changes detected by Changes.
14type Report struct {
15	Changes []Change
16}
17
18// A Change describes a single API change.
19type Change struct {
20	Message    string
21	Compatible bool
22}
23
24func (r Report) messages(compatible bool) []string {
25	var msgs []string
26	for _, c := range r.Changes {
27		if c.Compatible == compatible {
28			msgs = append(msgs, c.Message)
29		}
30	}
31	return msgs
32}
33
34func (r Report) String() string {
35	var buf bytes.Buffer
36	if err := r.Text(&buf); err != nil {
37		return fmt.Sprintf("!!%v", err)
38	}
39	return buf.String()
40}
41
42func (r Report) Text(w io.Writer) error {
43	if err := r.TextIncompatible(w, true); err != nil {
44		return err
45	}
46	return r.TextCompatible(w)
47}
48
49func (r Report) TextIncompatible(w io.Writer, withHeader bool) error {
50	if withHeader {
51		return r.writeMessages(w, "Incompatible changes:", r.messages(false))
52	}
53	return r.writeMessages(w, "", r.messages(false))
54}
55
56func (r Report) TextCompatible(w io.Writer) error {
57	return r.writeMessages(w, "Compatible changes:", r.messages(true))
58}
59
60func (r Report) writeMessages(w io.Writer, header string, msgs []string) error {
61	if len(msgs) == 0 {
62		return nil
63	}
64	if header != "" {
65		if _, err := fmt.Fprintf(w, "%s\n", header); err != nil {
66			return err
67		}
68	}
69	for _, m := range msgs {
70		if _, err := fmt.Fprintf(w, "- %s\n", m); err != nil {
71			return err
72		}
73	}
74	return nil
75}
76