package errors import ( "errors" "fmt" ) // todo rework errors package 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") ErrInsufficientFunds ErrorType = errors.New("insufficient funds") ) type Error interface { Error() string Type() ErrorType Wrap(message string) Error SetType(errorType ErrorType) Error } type customError struct { errorType ErrorType err error } func NewWithError(err error, errorType ErrorType) Error { return &customError{ errorType: errorType, err: err, } } func NewWithMessage(message string, errorType ErrorType) Error { return &customError{ errorType: errorType, err: errors.New(message), } } func (e *customError) Error() string { return e.err.Error() } func (e *customError) Type() ErrorType { return e.errorType } func (e *customError) Wrap(message string) Error { e.err = fmt.Errorf("%s: %w", message, e.err) return e } func (e *customError) SetType(errorType ErrorType) Error { e.errorType = errorType return e }