Skip to content

Commit 21d64a6

Browse files
committed
feat: handlers use errors.As to find wrapped FailureResponse errors
1 parent 074f91c commit 21d64a6

File tree

10 files changed

+60
-43
lines changed

10 files changed

+60
-43
lines changed

handlers/bind.go

Lines changed: 9 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handlers
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"log/slog"
78
"net/http"
@@ -58,18 +59,19 @@ func (h APIHandler) Bind(w http.ResponseWriter, req *http.Request) {
5859

5960
binding, err := h.serviceBroker.Bind(req.Context(), instanceID, bindingID, details, asyncAllowed)
6061
if err != nil {
61-
switch err := err.(type) {
62-
case *apiresponses.FailureResponse:
63-
statusCode := err.ValidatedStatusCode(slog.New(logger))
64-
errorResponse := err.ErrorResponse()
65-
if err == apiresponses.ErrInstanceDoesNotExist {
62+
var apiErr *apiresponses.FailureResponse
63+
switch {
64+
case errors.As(err, &apiErr):
65+
statusCode := apiErr.ValidatedStatusCode(slog.New(logger))
66+
errorResponse := apiErr.ErrorResponse()
67+
if errors.Is(apiErr, apiresponses.ErrInstanceDoesNotExist) {
6668
// work around ErrInstanceDoesNotExist having different pre-refactor behaviour to other actions
6769
errorResponse = apiresponses.ErrorResponse{
68-
Description: err.Error(),
70+
Description: apiErr.Error(),
6971
}
7072
statusCode = http.StatusNotFound
7173
}
72-
logger.Error(err.LoggerAction(), err)
74+
logger.Error(apiErr.LoggerAction(), err)
7375
h.respond(w, statusCode, requestId, errorResponse)
7476
default:
7577
logger.Error(unknownErrorKey, err)

handlers/catalog.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
"errors"
45
"fmt"
56
"log/slog"
67
"net/http"
@@ -17,10 +18,11 @@ func (h APIHandler) Catalog(w http.ResponseWriter, req *http.Request) {
1718

1819
services, err := h.serviceBroker.Services(req.Context())
1920
if err != nil {
20-
switch err := err.(type) {
21-
case *apiresponses.FailureResponse:
22-
logger.Error(err.LoggerAction(), err)
23-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
21+
var apiErr *apiresponses.FailureResponse
22+
switch {
23+
case errors.As(err, &apiErr):
24+
logger.Error(apiErr.LoggerAction(), err)
25+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
2426
default:
2527
logger.Error(unknownErrorKey, err)
2628
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/deprovision.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
"errors"
45
"fmt"
56
"log/slog"
67
"net/http"
@@ -46,10 +47,11 @@ func (h APIHandler) Deprovision(w http.ResponseWriter, req *http.Request) {
4647

4748
deprovisionSpec, err := h.serviceBroker.Deprovision(req.Context(), instanceID, details, asyncAllowed)
4849
if err != nil {
49-
switch err := err.(type) {
50-
case *apiresponses.FailureResponse:
51-
logger.Error(err.LoggerAction(), err)
52-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
50+
var apiErr *apiresponses.FailureResponse
51+
switch {
52+
case errors.As(err, &apiErr):
53+
logger.Error(apiErr.LoggerAction(), err)
54+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
5355
default:
5456
logger.Error(unknownErrorKey, err)
5557
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/get_binding.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@ func (h APIHandler) GetBinding(w http.ResponseWriter, req *http.Request) {
3939

4040
binding, err := h.serviceBroker.GetBinding(req.Context(), instanceID, bindingID, details)
4141
if err != nil {
42-
switch err := err.(type) {
43-
case *apiresponses.FailureResponse:
44-
logger.Error(err.LoggerAction(), err)
45-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
42+
var apiErr *apiresponses.FailureResponse
43+
switch {
44+
case errors.As(err, &apiErr):
45+
logger.Error(apiErr.LoggerAction(), err)
46+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
4647
default:
4748
logger.Error(unknownErrorKey, err)
4849
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/get_instance.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,11 @@ func (h APIHandler) GetInstance(w http.ResponseWriter, req *http.Request) {
3939

4040
instanceDetails, err := h.serviceBroker.GetInstance(req.Context(), instanceID, details)
4141
if err != nil {
42-
switch err := err.(type) {
43-
case *apiresponses.FailureResponse:
44-
logger.Error(err.LoggerAction(), err)
45-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
42+
var apiErr *apiresponses.FailureResponse
43+
switch {
44+
case errors.As(err, &apiErr):
45+
logger.Error(apiErr.LoggerAction(), err)
46+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
4647
default:
4748
logger.Error(unknownErrorKey, err)
4849
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/last_binding_operation.go

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -41,10 +41,11 @@ func (h APIHandler) LastBindingOperation(w http.ResponseWriter, req *http.Reques
4141

4242
lastOperation, err := h.serviceBroker.LastBindingOperation(req.Context(), instanceID, bindingID, pollDetails)
4343
if err != nil {
44-
switch err := err.(type) {
45-
case *apiresponses.FailureResponse:
46-
logger.Error(err.LoggerAction(), err)
47-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
44+
var apiErr *apiresponses.FailureResponse
45+
switch {
46+
case errors.As(err, &apiErr):
47+
logger.Error(apiErr.LoggerAction(), err)
48+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
4849
default:
4950
logger.Error(unknownErrorKey, err)
5051
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/last_operation.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
"errors"
45
"fmt"
56
"log/slog"
67
"net/http"
@@ -29,10 +30,11 @@ func (h APIHandler) LastOperation(w http.ResponseWriter, req *http.Request) {
2930

3031
lastOperation, err := h.serviceBroker.LastOperation(req.Context(), instanceID, pollDetails)
3132
if err != nil {
32-
switch err := err.(type) {
33-
case *apiresponses.FailureResponse:
34-
logger.Error(err.LoggerAction(), err)
35-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
33+
var apiErr *apiresponses.FailureResponse
34+
switch {
35+
case errors.As(err, &apiErr):
36+
logger.Error(apiErr.LoggerAction(), err)
37+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
3638
default:
3739
logger.Error(unknownErrorKey, err)
3840
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/provision.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handlers
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"log/slog"
78
"net/http"
@@ -94,10 +95,11 @@ func (h APIHandler) Provision(w http.ResponseWriter, req *http.Request) {
9495
provisionResponse, err := h.serviceBroker.Provision(req.Context(), instanceID, details, asyncAllowed)
9596

9697
if err != nil {
97-
switch err := err.(type) {
98-
case *apiresponses.FailureResponse:
99-
logger.Error(err.LoggerAction(), err)
100-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
98+
var apiErr *apiresponses.FailureResponse
99+
switch {
100+
case errors.As(err, &apiErr):
101+
logger.Error(apiErr.LoggerAction(), err)
102+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
101103
default:
102104
logger.Error(unknownErrorKey, err)
103105
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/unbind.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package handlers
22

33
import (
4+
"errors"
45
"fmt"
56
"log/slog"
67
"net/http"
@@ -45,10 +46,11 @@ func (h APIHandler) Unbind(w http.ResponseWriter, req *http.Request) {
4546
asyncAllowed := req.FormValue("accepts_incomplete") == "true"
4647
unbindResponse, err := h.serviceBroker.Unbind(req.Context(), instanceID, bindingID, details, asyncAllowed)
4748
if err != nil {
48-
switch err := err.(type) {
49-
case *apiresponses.FailureResponse:
50-
logger.Error(err.LoggerAction(), err)
51-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
49+
var apiErr *apiresponses.FailureResponse
50+
switch {
51+
case errors.As(err, &apiErr):
52+
logger.Error(apiErr.LoggerAction(), err)
53+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
5254
default:
5355
logger.Error(unknownErrorKey, err)
5456
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

handlers/update.go

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package handlers
22

33
import (
44
"encoding/json"
5+
"errors"
56
"fmt"
67
"log/slog"
78
"net/http"
@@ -43,10 +44,11 @@ func (h APIHandler) Update(w http.ResponseWriter, req *http.Request) {
4344

4445
updateServiceSpec, err := h.serviceBroker.Update(req.Context(), instanceID, details, acceptsIncompleteFlag)
4546
if err != nil {
46-
switch err := err.(type) {
47-
case *apiresponses.FailureResponse:
48-
logger.Error(err.LoggerAction(), err)
49-
h.respond(w, err.ValidatedStatusCode(slog.New(logger)), requestId, err.ErrorResponse())
47+
var apiErr *apiresponses.FailureResponse
48+
switch {
49+
case errors.As(err, &apiErr):
50+
logger.Error(apiErr.LoggerAction(), err)
51+
h.respond(w, apiErr.ValidatedStatusCode(slog.New(logger)), requestId, apiErr.ErrorResponse())
5052
default:
5153
logger.Error(unknownErrorKey, err)
5254
h.respond(w, http.StatusInternalServerError, requestId, apiresponses.ErrorResponse{

0 commit comments

Comments
 (0)