Browse code

Change return for errdefs.getImplementer()

The types defined in the errdefs package do not
satisfy the `error` interface, because they do not
implement `Error()`.

Instead of returning the matched interface, return
the original error.

When matching _multiple_ interfaces/types, Golang doesn't complain:

func getImplementer(err error) error {
switch e := err.(type) {
case
ErrNotFound,
ErrInvalidParameter:
return e
default:
return err
}
}

But matching a single interface/type:

func getImplementer(err error) error {
switch e := err.(type) {
case
ErrNotFound:
return e
default:
return err
}
}

Produces an error:

cannot use e (type ErrNotFound) as type error in return argument: ErrNotFound does not implement error (missing Error method)

Return the original `err` instead of the matched interface/type instead.

Also added some additional tests

Signed-off-by: Sebastiaan van Stijn <github@gone.nl>

Sebastiaan van Stijn authored on 2018/03/06 01:16:25
Showing 2 changed files
... ...
@@ -12,6 +12,9 @@ type causal interface {
12 12
 }
13 13
 
14 14
 func TestNotFound(t *testing.T) {
15
+	if IsNotFound(errTest) {
16
+		t.Fatalf("did not expect not found error, got %T", errTest)
17
+	}
15 18
 	e := NotFound(errTest)
16 19
 	if !IsNotFound(e) {
17 20
 		t.Fatalf("expected not found error, got: %T", e)
... ...
@@ -22,6 +25,9 @@ func TestNotFound(t *testing.T) {
22 22
 }
23 23
 
24 24
 func TestConflict(t *testing.T) {
25
+	if IsConflict(errTest) {
26
+		t.Fatalf("did not expect conflcit error, got %T", errTest)
27
+	}
25 28
 	e := Conflict(errTest)
26 29
 	if !IsConflict(e) {
27 30
 		t.Fatalf("expected conflcit error, got: %T", e)
... ...
@@ -32,6 +38,9 @@ func TestConflict(t *testing.T) {
32 32
 }
33 33
 
34 34
 func TestForbidden(t *testing.T) {
35
+	if IsForbidden(errTest) {
36
+		t.Fatalf("did not expect forbidden error, got %T", errTest)
37
+	}
35 38
 	e := Forbidden(errTest)
36 39
 	if !IsForbidden(e) {
37 40
 		t.Fatalf("expected forbidden error, got: %T", e)
... ...
@@ -42,6 +51,9 @@ func TestForbidden(t *testing.T) {
42 42
 }
43 43
 
44 44
 func TestInvalidParameter(t *testing.T) {
45
+	if IsInvalidParameter(errTest) {
46
+		t.Fatalf("did not expect invalid argument error, got %T", errTest)
47
+	}
45 48
 	e := InvalidParameter(errTest)
46 49
 	if !IsInvalidParameter(e) {
47 50
 		t.Fatalf("expected invalid argument error, got %T", e)
... ...
@@ -52,6 +64,9 @@ func TestInvalidParameter(t *testing.T) {
52 52
 }
53 53
 
54 54
 func TestNotImplemented(t *testing.T) {
55
+	if IsNotImplemented(errTest) {
56
+		t.Fatalf("did not expect not implemented error, got %T", errTest)
57
+	}
55 58
 	e := NotImplemented(errTest)
56 59
 	if !IsNotImplemented(e) {
57 60
 		t.Fatalf("expected not implemented error, got %T", e)
... ...
@@ -62,6 +77,9 @@ func TestNotImplemented(t *testing.T) {
62 62
 }
63 63
 
64 64
 func TestNotModified(t *testing.T) {
65
+	if IsNotModified(errTest) {
66
+		t.Fatalf("did not expect not modified error, got %T", errTest)
67
+	}
65 68
 	e := NotModified(errTest)
66 69
 	if !IsNotModified(e) {
67 70
 		t.Fatalf("expected not modified error, got %T", e)
... ...
@@ -72,6 +90,9 @@ func TestNotModified(t *testing.T) {
72 72
 }
73 73
 
74 74
 func TestAlreadyExists(t *testing.T) {
75
+	if IsAlreadyExists(errTest) {
76
+		t.Fatalf("did not expect already exists error, got %T", errTest)
77
+	}
75 78
 	e := AlreadyExists(errTest)
76 79
 	if !IsAlreadyExists(e) {
77 80
 		t.Fatalf("expected already exists error, got %T", e)
... ...
@@ -82,6 +103,9 @@ func TestAlreadyExists(t *testing.T) {
82 82
 }
83 83
 
84 84
 func TestUnauthorized(t *testing.T) {
85
+	if IsUnauthorized(errTest) {
86
+		t.Fatalf("did not expect unauthorized error, got %T", errTest)
87
+	}
85 88
 	e := Unauthorized(errTest)
86 89
 	if !IsUnauthorized(e) {
87 90
 		t.Fatalf("expected unauthorized error, got %T", e)
... ...
@@ -92,6 +116,9 @@ func TestUnauthorized(t *testing.T) {
92 92
 }
93 93
 
94 94
 func TestUnknown(t *testing.T) {
95
+	if IsUnknown(errTest) {
96
+		t.Fatalf("did not expect unknown error, got %T", errTest)
97
+	}
95 98
 	e := Unknown(errTest)
96 99
 	if !IsUnknown(e) {
97 100
 		t.Fatalf("expected unknown error, got %T", e)
... ...
@@ -102,9 +129,12 @@ func TestUnknown(t *testing.T) {
102 102
 }
103 103
 
104 104
 func TestCancelled(t *testing.T) {
105
+	if IsCancelled(errTest) {
106
+		t.Fatalf("did not expect cancelled error, got %T", errTest)
107
+	}
105 108
 	e := Cancelled(errTest)
106 109
 	if !IsCancelled(e) {
107
-		t.Fatalf("expected canclled error, got %T", e)
110
+		t.Fatalf("expected cancelled error, got %T", e)
108 111
 	}
109 112
 	if cause := e.(causal).Cause(); cause != errTest {
110 113
 		t.Fatalf("causual should be errTest, got: %v", cause)
... ...
@@ -112,6 +142,9 @@ func TestCancelled(t *testing.T) {
112 112
 }
113 113
 
114 114
 func TestDeadline(t *testing.T) {
115
+	if IsDeadline(errTest) {
116
+		t.Fatalf("did not expect deadline error, got %T", errTest)
117
+	}
115 118
 	e := Deadline(errTest)
116 119
 	if !IsDeadline(e) {
117 120
 		t.Fatalf("expected deadline error, got %T", e)
... ...
@@ -121,7 +154,10 @@ func TestDeadline(t *testing.T) {
121 121
 	}
122 122
 }
123 123
 
124
-func TestIsDataLoss(t *testing.T) {
124
+func TestDataLoss(t *testing.T) {
125
+	if IsDataLoss(errTest) {
126
+		t.Fatalf("did not expect data loss error, got %T", errTest)
127
+	}
125 128
 	e := DataLoss(errTest)
126 129
 	if !IsDataLoss(e) {
127 130
 		t.Fatalf("expected data loss error, got %T", e)
... ...
@@ -130,3 +166,16 @@ func TestIsDataLoss(t *testing.T) {
130 130
 		t.Fatalf("causual should be errTest, got: %v", cause)
131 131
 	}
132 132
 }
133
+
134
+func TestUnavailable(t *testing.T) {
135
+	if IsUnavailable(errTest) {
136
+		t.Fatalf("did not expect unavaillable error, got %T", errTest)
137
+	}
138
+	e := Unavailable(errTest)
139
+	if !IsUnavailable(e) {
140
+		t.Fatalf("expected unavaillable error, got %T", e)
141
+	}
142
+	if cause := e.(causal).Cause(); cause != errTest {
143
+		t.Fatalf("causual should be errTest, got: %v", cause)
144
+	}
145
+}
... ...
@@ -21,7 +21,7 @@ func getImplementer(err error) error {
21 21
 		ErrDeadline,
22 22
 		ErrDataLoss,
23 23
 		ErrUnknown:
24
-		return e
24
+		return err
25 25
 	case causer:
26 26
 		return getImplementer(e.Cause())
27 27
 	default: