package rescode import ( "fmt" "net/http" ) // 只允许使用下面的几个http状态码 const ( HttpCode200 = http.StatusOK HttpCode400 = http.StatusBadRequest HttpCode401 = http.StatusUnauthorized HttpCode403 = http.StatusForbidden HttpCode404 = http.StatusNotFound HttpCode500 = http.StatusInternalServerError ) const ( successCode = 000000 unknownCode = 999999 ) var ( successErrCode = ErrCode{ httpCode: HttpCode200, code: successCode, message: "成功", reference: "", } unknownErrCode = ErrCode{ httpCode: HttpCode500, code: unknownCode, message: "未知错误", reference: "未知错误,请联系系统开发者", } ) type ErrCode struct { httpCode int code int cause error message string reference string tips string } func NewErrCode(httpCode, code int, message, reference string) *ErrCode { return &ErrCode{ httpCode: httpCode, code: code, message: message, reference: reference, } } func (ec *ErrCode) HTTPStatus() int { return ec.httpCode } func (ec *ErrCode) Code() string { return fmt.Sprintf("%06d", ec.code) } func (ec *ErrCode) Reference() string { return ec.reference } func (ec *ErrCode) Message() string { return ec.message } func (ec *ErrCode) Cause() error { return ec.cause } func (ec *ErrCode) Error() string { var cause string if ec.cause != nil { cause = ec.cause.Error() } return fmt.Sprintf("response:%s tips:%s cause:%s", ec.message, ec.tips, cause) } func RegisterErrorWithCause(cause error, errCode *ErrCode) error { return &ErrCode{ httpCode: errCode.httpCode, code: errCode.code, cause: cause, tips: "", message: errCode.message, reference: errCode.reference, } } func RegisterErrorWithMessage(cause error, tips string, errCode *ErrCode) error { return &ErrCode{ httpCode: errCode.httpCode, code: errCode.code, cause: cause, message: errCode.message, tips: tips, reference: errCode.reference, } } func ParseCode(err error) *ErrCode { if err == nil { return nil } if v, ok := err.(*ErrCode); ok { return v } return &unknownErrCode }