diff --git a/spew/common.go b/spew/common.go index 6b8bfec..11ec612 100644 --- a/spew/common.go +++ b/spew/common.go @@ -150,11 +150,26 @@ func handleMethods(cs *ConfigState, w io.Writer, v reflect.Value) (handled bool) switch iface := viface.(type) { case error: defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(append(openParenBytes, []byte(iface.Error())...)) + w.Write(closeParenBytes) + w.Write(spaceBytes) + + return false + } + w.Write([]byte(iface.Error())) return true case fmt.Stringer: defer catchPanic(w, v) + if cs.ContinueOnMethod { + w.Write(append(openParenBytes, []byte(iface.String())...)) + w.Write(closeParenBytes) + w.Write(spaceBytes) + + return false + } w.Write([]byte(iface.String())) return true } diff --git a/spew/config.go b/spew/config.go index 41b2bc8..ea521cc 100644 --- a/spew/config.go +++ b/spew/config.go @@ -62,6 +62,13 @@ type ConfigState struct { // interface with a pointer receiver should not be mutating their state // inside these interface methods. DisablePointerMethods bool + + //ContinueOnMethod specifies whether recursion should stop once + //a Stringer or an error interface is encountered. + // + //It defaults to false, meaning that it does not pretty-print + //the internals of Stringers or errors. + ContinueOnMethod bool } // Config is the active configuration of the top-level functions.