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