package main
import (
)
type textGenerator struct {
w *sectionIndentWriter
}
func ( io.Writer, *report) error {
:= &textGenerator{newSectionIndentWriter(, " ")}
if := .visitReport(); != nil {
return
}
return nil
}
func ( *textGenerator) ( *report) error {
if := .visitTestReport(.Tests); != nil {
return
}
if := .visitStateDiff(.State); != nil {
return
}
return nil
}
func ( *textGenerator) ( *testReport) error {
if == nil {
return nil
}
return .section("TESTS", func() error {
if := .visitTestReportEvents(.Events, .Failed); != nil {
return
}
if := .visitTestReportDecodeError(.Decode); != nil {
return
}
if := .visitTestReportBuffer(.Buffer); != nil {
return
}
if := .visitTestReportStderr(.Stderr); != nil {
return
}
return nil
})
}
func ( *textGenerator) ( []testEvent, bool) error {
if len() == 0 {
return nil
}
return .section("OUTPUT", func() error {
for , := range {
if .Output == nil {
continue
}
:= *.Output
if ! && !strings.HasPrefix(, "ok \t") && !strings.HasPrefix(, "? \t") {
continue
}
if := .writeRawString(); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( error) error {
if == nil {
return nil
}
return .section("INTERNAL ERROR", func() error {
return .writeString(.Error())
})
}
func ( *textGenerator) ( []byte) error {
if len() == 0 {
return nil
}
return .section("MALFORMED OUTPUT", func() error {
return .writeBytes()
})
}
func ( *textGenerator) ( []byte) error {
if len() == 0 {
return nil
}
return .section("STDERR", func() error {
return .writeBytes()
})
}
func ( *textGenerator) ( stateDiff) error {
if len(.Updated) == 0 && len(.Removed) == 0 && len(.Added) == 0 {
return nil
}
return .section("DEPENDENCIES", func() error {
if := .visitStateDiffRemoved(.Removed); != nil {
return nil
}
if := .visitStateDiffAdded(.Added); != nil {
return nil
}
if := .visitStateDiffUpdated(.Updated); != nil {
return nil
}
return nil
})
}
func ( *textGenerator) ( []packages.Module) error {
return .sectionStateDiffModules("REMOVED", )
}
func ( *textGenerator) ( []packages.Module) error {
return .sectionStateDiffModules("ADDED", )
}
func ( *textGenerator) ( string, []packages.Module) error {
if len() == 0 {
return nil
}
return .section(, func() error {
for , := range {
if := .writeString(.Path + "@" + .Version); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( []moduleDiff) error {
if len() == 0 {
return nil
}
return .section("UPDATED", func() error {
for , := range {
if := .visitModuleDiff(); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( moduleDiff) error {
return .section(.Path+"@"+.Old.Version+" => "+.New.Version, func() error {
if len(.Removed) == 0 && len(.Added) == 0 && len(.Changed) == 0 && len(.NewBroken) == 0 && len(.OldBroken) == 0 {
return .writeString("no changes")
}
if := .visitModuleDiffRemoved(.Removed); != nil {
return
}
if := .visitModuleDiffAdded(.Added); != nil {
return
}
if := .visitModuleDiffChanged(.Changed); != nil {
return
}
if := .visitModuleDiffOldBroken(.OldBroken); != nil {
return
}
if := .visitModuleDiffNewBroken(.OldBroken); != nil {
return
}
return nil
})
}
func ( *textGenerator) ( []*packages.Package) error {
return .sectionModuleDiffPackages("REMOVED PACKAGES", )
}
func ( *textGenerator) ( []*packages.Package) error {
return .sectionModuleDiffPackages("ADDED PACKAGES", )
}
func ( *textGenerator) ( string, []*packages.Package) error {
if len() == 0 {
return nil
}
return .section(, func() error {
for , := range {
if := .writeString(.PkgPath); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( []packageDiff) error {
if len() == 0 {
return nil
}
return .section("CHANGED", func() error {
for , := range {
if := .visitPackageDiff(); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( []*packages.Package) error {
return .sectionBrokenPackages("OLD BROKEN", )
}
func ( *textGenerator) ( []*packages.Package) error {
return .sectionBrokenPackages("NEW BROKEN", )
}
func ( *textGenerator) ( string, []*packages.Package) error {
if len() == 0 {
return nil
}
return .section(, func() error {
for , := range {
if := .sectionPackageErrors(.PkgPath, .Errors); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( string, []packages.Error) error {
if len() == 0 {
return nil
}
return .section(, func() error {
for , := range {
if := .writeString(.Error()); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( packageDiff) error {
if len(.Diff.Changes) == 0 {
return nil
}
return .section(.Path, func() error {
if := .visitPacakgeDiffIncompatible(.Incompatible()); != nil {
return
}
if := .visitPacakgeDiffCompatible(.Compatible()); != nil {
return
}
return nil
})
}
func ( *textGenerator) ( []apidiff.Change) error {
return .sectionPackageDiffChanges("INCOMPATIBLE", )
}
func ( *textGenerator) ( []apidiff.Change) error {
return .sectionPackageDiffChanges("COMPATIBLE", )
}
func ( *textGenerator) ( string, []apidiff.Change) error {
if len() == 0 {
return nil
}
return .section(, func() error {
for , := range {
if := .writeString(.Message); != nil {
return
}
}
return nil
})
}
func ( *textGenerator) ( string, func() error) error {
if := .writeString(); != nil {
return
}
if := .w.Section(); != nil {
return
}
return nil
}
func ( *textGenerator) ( string) error {
return .writeBytes([]byte())
}
func ( *textGenerator) ( []byte) error {
if , := .w.Write(); != nil {
return
}
if len() == 0 || [len()-1] != '\n' {
, := .w.Write([]byte{'\n'})
return
}
return nil
}
func ( *textGenerator) ( string) error {
return .writeRawBytes([]byte())
}
func ( *textGenerator) ( []byte) error {
if , := .w.Write(); != nil {
return
}
return nil
}
type sectionIndentWriter struct {
wr io.Writer
indent io.Writer
pre []byte
}
func ( io.Writer, string) *sectionIndentWriter {
return §ionIndentWriter{
wr: ,
pre: []byte(),
}
}
func ( *sectionIndentWriter) ( func() error) error {
:= .indent
:= text.NewIndentWriter(.writer(), .pre)
.indent =
:= ()
.indent =
return
}
func ( *sectionIndentWriter) ( []byte) (int, error) {
return .writer().Write()
}
func ( *sectionIndentWriter) () io.Writer {
:= .indent
if == nil {
= .wr
}
return
}