소스 검색

Add support for Go 1.13 error chains (#206)

* Add support for Go 1.13 error chains

Go 1.13 adds support for error chains to the standard libary's errors
package. The new standard library functions require an Unwrap method to
be provided by an error type. This change adds a new Unwrap method
(identical to the existing Cause method) to the unexported error types.
Jay Petacat 6 년 전
부모
커밋
7f95ac13ed
2개의 변경된 파일22개의 추가작업 그리고 0개의 파일을 삭제
  1. 6 0
      errors.go
  2. 16 0
      go113_test.go

+ 6 - 0
errors.go

@@ -159,6 +159,9 @@ type withStack struct {
 
 func (w *withStack) Cause() error { return w.error }
 
+// Unwrap provides compatibility for Go 1.13 error chains.
+func (w *withStack) Unwrap() error { return w.error }
+
 func (w *withStack) Format(s fmt.State, verb rune) {
 	switch verb {
 	case 'v':
@@ -241,6 +244,9 @@ type withMessage struct {
 func (w *withMessage) Error() string { return w.msg + ": " + w.cause.Error() }
 func (w *withMessage) Cause() error  { return w.cause }
 
+// Unwrap provides compatibility for Go 1.13 error chains.
+func (w *withMessage) Unwrap() error { return w.cause }
+
 func (w *withMessage) Format(s fmt.State, verb rune) {
 	switch verb {
 	case 'v':

+ 16 - 0
go113_test.go

@@ -0,0 +1,16 @@
+// +build go1.13
+
+package errors
+
+import (
+	stdlib_errors "errors"
+	"testing"
+)
+
+func TestErrorChainCompat(t *testing.T) {
+	err := stdlib_errors.New("error that gets wrapped")
+	wrapped := Wrap(err, "wrapped up")
+	if !stdlib_errors.Is(wrapped, err) {
+		t.Errorf("Wrap does not support Go 1.13 error chains")
+	}
+}