package errors import ( "errors" "fmt" ) type ErrorType error var ( ErrInternalError ErrorType = errors.New("internal error") ErrInvalidArgs ErrorType = errors.New("invalid arguments") ErrMethodNotImplemented ErrorType = errors.New("method is not implemented") ErrNotFound ErrorType = errors.New("record not found") ErrNoAccess ErrorType = errors.New("no access") ErrConflict ErrorType = errors.New("record already exist") ) type Error interface { Error() string Extract() error Type() ErrorType Wrap(err error) SetType(errorType ErrorType) } type customError struct { errorType ErrorType err error } func New(err error, errorType ErrorType) *customError { return &customError{ errorType: errorType, err: err, } } func (receiver *customError) Error() string { return receiver.err.Error() } func (receiver *customError) Type() ErrorType { return receiver.errorType } func (receiver *customError) Wrap(err error) { receiver.err = fmt.Errorf("%w: %w", receiver.err, err) } func (receiver *customError) SetType(errorType ErrorType) { receiver.errorType = errorType } func (receiver *customError) Extract() error { return receiver.err }