From 968b886ac07cb607fc4a6e01be263efe93c90be8 Mon Sep 17 00:00:00 2001 From: Jonathan KUMA Date: Tue, 30 May 2023 11:43:58 +0200 Subject: [PATCH] [Error] Introduce ErrorBuilder type and AddErrorBuilders() callback. --- errors/builder.go | 27 +++++++++++++++++++++++++++ errors/error.go | 6 ++++++ 2 files changed, 33 insertions(+) create mode 100644 errors/builder.go diff --git a/errors/builder.go b/errors/builder.go new file mode 100644 index 0000000..8dc0350 --- /dev/null +++ b/errors/builder.go @@ -0,0 +1,27 @@ +package errors + +import ( + "sync" +) + +var ( + // errorBuilders slice contains all custom ErrorBuilder callbacks. + // You can update this list if you want to change ErrorBuilder callbacks + // for all you handlers. + errorBuilders []ErrorBuilder + + // addErrorBuildersMU is a sync.Mutex used by AddErrorBuilders. + addErrorBuildersMU sync.Mutex +) + +// ErrorBuilder is a callback that transform the given error to a gapi Error. +type ErrorBuilder func(err error) Error + +// AddErrorBuilders appends custom errors.ErrorBuilder. +// These callbacks are executed when wrapping an error with errors.Wrap(). +func AddErrorBuilders(builders ...ErrorBuilder) { + addErrorBuildersMU.Lock() + defer addErrorBuildersMU.Unlock() + + errorBuilders = append(errorBuilders, builders...) +} diff --git a/errors/error.go b/errors/error.go index ac8a841..cbc4243 100644 --- a/errors/error.go +++ b/errors/error.go @@ -41,6 +41,12 @@ func Wrap(err error) Error { return nil } + for _, builder := range errorBuilders { + if gErr := builder(err); gErr != nil { + return gErr + } + } + newErr := &FullError{ userMessage: err.Error(), kind: "",