package errors import ( "fmt" "io" ) type hasCause interface { Cause() error } type hasDetails interface { Details() string } type hasSolution interface { Solution() string } func PrintError(err error, out io.Writer) { fmt.Fprintf(out, "%v\n", err) if d, ok := err.(hasDetails); ok && len(d.Details()) > 0 { fmt.Fprintf(out, "%s\n", d.Details()) } if c, ok := err.(hasCause); ok && c.Cause() != nil { fmt.Fprintf(out, "%v\n", c.Cause()) } if s, ok := err.(hasSolution); ok && len(s.Solution()) > 0 { fmt.Fprintf(out, "%s", s.Solution()) } }