package main

import (
	
	

	
	
	
)

type textGenerator struct {
	w *sectionIndentWriter
}

func ( io.Writer,  *report) error {
	 := &textGenerator{newSectionIndentWriter(, "    ")} // four space indent
	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 &sectionIndentWriter{
		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 
}