package errors import ( "fmt" ) type Error struct { Message string Cause error Type ErrorType } type ErrorType int const ( ErrorTypeUnknown ErrorType = iota ErrorTypeClient ErrorTypeServer ) func (e *Error) Error() string { if e.Cause != nil { return fmt.Sprintf("%s: %v", e.Message, e.Cause) } return e.Message } func (e *Error) Unwrap() error { return e.Cause } func New(message string) error { return &Error{ Message: message, Type: ErrorTypeUnknown, } } func Wrap(err error, message string) error { if err == nil { return nil } return &Error{ Message: message, Cause: err, Type: ErrorTypeUnknown, } } func NewClientError(message string) error { return &Error{ Message: message, Type: ErrorTypeClient, } } func NewServerError(message string) error { return &Error{ Message: message, Type: ErrorTypeServer, } } func IsClientError(err error) bool { if err == nil { return false } if e, ok := err.(*Error); ok { return e.Type == ErrorTypeClient } return false } func IsServerError(err error) bool { if err == nil { return false } if e, ok := err.(*Error); ok { return e.Type == ErrorTypeServer } return false }