浏览代码

revert previous mis-commits, add ability to allow deeper pretty-printing after an error or Stringer interface is encountered.

Thomas NJ Shadwell 12 年之前
父节点
当前提交
f948516369
共有 2 个文件被更改,包括 22 次插入33 次删除
  1. 15 0
      spew/common.go
  2. 7 33
      spew/config.go

+ 15 - 0
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
 	}

+ 7 - 33
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.
@@ -151,39 +158,6 @@ func (c *ConfigState) Println(a ...interface{}) (n int, err error) {
 	return fmt.Println(c.convertArgs(a)...)
 }
 
-// Sprint is a wrapper for fmt.Sprint that treats each argument as if it were
-// passed with a Formatter interface returned by c.NewFormatter.  It returns
-// the resulting string.  See NewFormatter for formatting details.
-//
-// This function is shorthand for the following syntax:
-//
-//	fmt.Sprint(c.NewFormatter(a), c.NewFormatter(b))
-func (c *ConfigState) Sprint(a ...interface{}) string {
-	return fmt.Sprint(c.convertArgs(a)...)
-}
-
-// Sprintf is a wrapper for fmt.Sprintf that treats each argument as if it were
-// passed with a Formatter interface returned by c.NewFormatter.  It returns
-// the resulting string.  See NewFormatter for formatting details.
-//
-// This function is shorthand for the following syntax:
-//
-//	fmt.Sprintf(format, c.NewFormatter(a), c.NewFormatter(b))
-func (c *ConfigState) Sprintf(format string, a ...interface{}) string {
-	return fmt.Sprintf(format, c.convertArgs(a)...)
-}
-
-// Sprintln is a wrapper for fmt.Sprintln that treats each argument as if it
-// were passed with a Formatter interface returned by c.NewFormatter.  It
-// returns the resulting string.  See NewFormatter for formatting details.
-//
-// This function is shorthand for the following syntax:
-//
-//	fmt.Sprintln(c.NewFormatter(a), c.NewFormatter(b))
-func (c *ConfigState) Sprintln(a ...interface{}) string {
-	return fmt.Sprintln(c.convertArgs(a)...)
-}
-
 /*
 NewFormatter returns a custom formatter that satisfies the fmt.Formatter
 interface.  As a result, it integrates cleanly with standard fmt package