diff --git a/pkg.go b/pkg.go index 63ad339..cf46dd3 100644 --- a/pkg.go +++ b/pkg.go @@ -10,9 +10,16 @@ import ( type Error struct { Wrapped error ErrStr string // wrapped error isn't necessarily json encodable + Code string `json:",omitempty"` File string Line int - Data interface{} `json:",omitempty"` + Data any `json:",omitempty"` +} + +type CodableError interface { + error + WithCode(string) CodableError + WithData(any) CodableError } type LogCallback func(Error) @@ -43,15 +50,20 @@ func callback(wrapped Error) { // Error implements the error inteface and adds filename and line to the error. func (wrapped Error) Error() string { + var code string + if wrapped.Code != "" { + code = wrapped.Code + " " + } return fmt.Sprintf( - "[%s:%d] %s", + "%s[%s:%d] %s", + code, wrapped.File, wrapped.Line, wrapped.Wrapped.Error(), ) } -func create(err error, data interface{}) error { +func create(err error, data interface{}) *Error { if err == nil { return nil } @@ -67,27 +79,38 @@ func create(err error, data interface{}) error { } callback(wrapped) - return wrapped + return &wrapped } // Wrap wraps an existing error with file and line. -func Wrap(err error) error { +func Wrap(err error) *Error { return create(err, nil) } -func WrapData(err error, data interface{}) error { +func WrapData(err error, data interface{}) *Error { return create(err, data) } // New creates a new wrapped error with file and line. -func New(msg string, params ...any) error { +func New(msg string, params ...any) *Error { err := fmt.Errorf(msg, params...) - wrapped := create(err, "") + wrapped := create(err, nil) return wrapped } -func NewData(msg string, data interface{}, params ...any) error { +// NewData creates a new WrappedError with associated data. +func NewData(msg string, data interface{}, params ...any) *Error { err := fmt.Errorf(msg, params...) wrapped := create(err, data) return wrapped } + +func (e *Error) WithCode(code string) CodableError { + e.Code = code + return e +} + +func (e *Error) WithData(data any) CodableError { + e.Data = data + return e +}