Просмотр исходного кода

Merge pull request #15 from gabrielf/wrapprefix-shouldnt-mutate-original-error

WrapPrefix no longer mutates original error.
Conrad Irwin 8 лет назад
Родитель
Сommit
3afebba5a4
2 измененных файлов с 12 добавлено и 5 удалено
  1. 6 4
      error.go
  2. 6 1
      error_test.go

+ 6 - 4
error.go

@@ -121,12 +121,14 @@ func WrapPrefix(e interface{}, prefix string, skip int) *Error {
 	err := Wrap(e, 1+skip)
 
 	if err.prefix != "" {
-		err.prefix = fmt.Sprintf("%s: %s", prefix, err.prefix)
-	} else {
-		err.prefix = prefix
+		prefix = fmt.Sprintf("%s: %s", prefix, err.prefix)
 	}
 
-	return err
+	return &Error{
+		Err:    err.Err,
+		stack:  err.stack,
+		prefix: prefix,
+	}
 
 }
 

+ 6 - 1
error_test.go

@@ -4,6 +4,7 @@ import (
 	"bytes"
 	"fmt"
 	"io"
+	"reflect"
 	"runtime/debug"
 	"strings"
 	"testing"
@@ -151,10 +152,14 @@ func TestWrapPrefixError(t *testing.T) {
 	prefixed := WrapPrefix(e, "prefix", 0)
 	original := e.(*Error)
 
-	if prefixed.Err != original.Err || &prefixed.stack != &original.stack || &prefixed.frames != &original.frames || prefixed.Error() != "prefix: prefix: hi" {
+	if prefixed.Err != original.Err || !reflect.DeepEqual(prefixed.stack, original.stack) || !reflect.DeepEqual(prefixed.frames, original.frames) || prefixed.Error() != "prefix: prefix: hi" {
 		t.Errorf("Constructor with an Error failed")
 	}
 
+	if original.Error() == prefixed.Error() {
+		t.Errorf("WrapPrefix changed the original error")
+	}
+
 	if WrapPrefix(nil, "prefix", 0).Error() != "prefix: <nil>" {
 		t.Errorf("Constructor with nil failed")
 	}