From 10085063fb0b55f51b0f627beeaa8c25c0369221 Mon Sep 17 00:00:00 2001 From: Will Norris Date: Wed, 1 Feb 2023 14:07:24 -0800 Subject: [PATCH] util/vizerror: add As function to get wrapped Error Signed-off-by: Will Norris --- tsweb/tsweb.go | 3 +-- util/vizerror/vizerror.go | 6 ++++++ util/vizerror/vizerror_test.go | 14 ++++++++++++++ 3 files changed, 21 insertions(+), 2 deletions(-) diff --git a/tsweb/tsweb.go b/tsweb/tsweb.go index 4f80f915d..23034ec6f 100644 --- a/tsweb/tsweb.go +++ b/tsweb/tsweb.go @@ -266,11 +266,10 @@ func (h retHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { err := h.rh.ServeHTTPReturn(lw, r) var hErr HTTPError - var vizErr vizerror.Error var hErrOK bool if errors.As(err, &hErr) { hErrOK = true - } else if errors.As(err, &vizErr) { + } else if vizErr, ok := vizerror.As(err); ok { hErrOK = true hErr = HTTPError{Msg: vizErr.Error()} } diff --git a/util/vizerror/vizerror.go b/util/vizerror/vizerror.go index a1268739f..158786494 100644 --- a/util/vizerror/vizerror.go +++ b/util/vizerror/vizerror.go @@ -42,3 +42,9 @@ func Wrap(err error) error { } return Error{err} } + +// As returns the first vizerror.Error in err's chain. +func As(err error) (e Error, ok bool) { + ok = errors.As(err, &e) + return +} diff --git a/util/vizerror/vizerror_test.go b/util/vizerror/vizerror_test.go index c62ab53df..bbd2c07e5 100644 --- a/util/vizerror/vizerror_test.go +++ b/util/vizerror/vizerror_test.go @@ -5,6 +5,7 @@ import ( "errors" + "fmt" "io/fs" "testing" ) @@ -28,3 +29,16 @@ func TestErrorf(t *testing.T) { t.Errorf("error chain does not contain fs.ErrNotExist") } } + +func TestAs(t *testing.T) { + verr := New("visible error") + err := fmt.Errorf("wrap: %w", verr) + + got, ok := As(err) + if !ok { + t.Errorf("As() return false, want true") + } + if got != verr { + t.Errorf("As() returned error %v, want %v", got, verr) + } +}