| package errorsx |
|
|
| import ( |
| "context" |
| "errors" |
| "log/slog" |
|
|
| "github.com/samber/lo" |
|
|
| "github.com/openmeterio/openmeter/pkg/framework/transport/httptransport" |
| ) |
|
|
| var ( |
| _ httptransport.ErrorHandler = (Handler)(nil) |
| _ Handler = (*SlogHandler)(nil) |
| _ Handler = (*NopHandler)(nil) |
| ) |
|
|
| |
| |
| type Handler interface { |
| Handle(err error) |
| HandleContext(ctx context.Context, err error) |
| } |
|
|
| |
| type SlogHandler struct { |
| Logger *slog.Logger |
| } |
|
|
| func NewSlogHandler(logger *slog.Logger) SlogHandler { |
| return SlogHandler{Logger: logger} |
| } |
|
|
| func (h SlogHandler) Handle(err error) { |
| |
| if errors.Is(err, context.Canceled) { |
| h.Logger.Warn(err.Error()) |
| return |
| } |
|
|
| if isAPIError(err) { |
| h.Logger.Warn(err.Error()) |
| return |
| } |
|
|
| |
| if wErr, ok := lo.ErrorsAs[*warnError](err); ok { |
| h.Logger.Warn(wErr.Error()) |
| return |
| } |
|
|
| |
| h.Logger.Error(err.Error()) |
| } |
|
|
| func (h SlogHandler) HandleContext(ctx context.Context, err error) { |
| |
| if errors.Is(err, context.Canceled) { |
| h.Logger.WarnContext(ctx, err.Error()) |
| return |
| } |
|
|
| if isAPIError(err) { |
| h.Logger.WarnContext(ctx, err.Error()) |
| return |
| } |
|
|
| |
| if wErr, ok := lo.ErrorsAs[*warnError](err); ok { |
| h.Logger.WarnContext(ctx, wErr.Error()) |
| return |
| } |
|
|
| |
| h.Logger.ErrorContext(ctx, err.Error()) |
| } |
|
|
| |
| type NopHandler struct{} |
|
|
| func NewNopHandler() NopHandler { |
| return NopHandler{} |
| } |
|
|
| func (h NopHandler) Handle(err error) { |
| } |
|
|
| func (h NopHandler) HandleContext(ctx context.Context, err error) { |
| } |
|
|