package shumai import ( "fmt" ) // ShumaiError 数脉服务错误 type ShumaiError struct { Code string `json:"code"` Message string `json:"message"` } // Error 实现 error 接口 func (e *ShumaiError) Error() string { return fmt.Sprintf("数脉错误 [%s]: %s", e.Code, e.Message) } // IsSuccess 是否成功 func (e *ShumaiError) IsSuccess() bool { return e.Code == "0" || e.Code == "200" } // IsNoRecord 是否查无记录 func (e *ShumaiError) IsNoRecord() bool { return e.Code == "404" } // IsParamError 是否参数错误 func (e *ShumaiError) IsParamError() bool { return e.Code == "400" } // IsAuthError 是否认证错误 func (e *ShumaiError) IsAuthError() bool { return e.Code == "601" || e.Code == "602" } // IsSystemError 是否系统错误 func (e *ShumaiError) IsSystemError() bool { return e.Code == "500" || e.Code == "501" } // 预定义错误 var ( ErrSuccess = &ShumaiError{Code: "200", Message: "成功"} ErrParamError = &ShumaiError{Code: "400", Message: "参数错误"} ErrNoRecord = &ShumaiError{Code: "404", Message: "请求资源不存在"} ErrSystemError = &ShumaiError{Code: "500", Message: "系统内部错误,请联系服务商"} ErrThirdPartyError = &ShumaiError{Code: "501", Message: "第三方服务异常"} ErrNoPermission = &ShumaiError{Code: "601", Message: "服务商未开通接口权限"} ErrAccountDisabled = &ShumaiError{Code: "602", Message: "账号停用"} ErrInsufficientBalance = &ShumaiError{Code: "603", Message: "余额不足请充值"} ErrInterfaceDisabled = &ShumaiError{Code: "604", Message: "接口停用"} ErrInsufficientQuota = &ShumaiError{Code: "605", Message: "次数不足,请购买套餐"} ErrRateLimitExceeded = &ShumaiError{Code: "606", Message: "调用超限,请联系服务商"} ErrOther = &ShumaiError{Code: "1001", Message: "其他,以实际返回为准"} ) // NewShumaiError 创建数脉错误 func NewShumaiError(code, message string) *ShumaiError { return &ShumaiError{Code: code, Message: message} } // NewShumaiErrorFromCode 根据状态码创建错误 func NewShumaiErrorFromCode(code string) *ShumaiError { switch code { case "0", "200": return ErrSuccess case "400": return ErrParamError case "404": return ErrNoRecord case "500": return ErrSystemError case "501": return ErrThirdPartyError case "601": return ErrNoPermission case "602": return ErrAccountDisabled case "603": return ErrInsufficientBalance case "604": return ErrInterfaceDisabled case "605": return ErrInsufficientQuota case "606": return ErrRateLimitExceeded case "1001": return ErrOther default: return &ShumaiError{Code: code, Message: "未知错误"} } } // IsShumaiError 是否为数脉错误 func IsShumaiError(err error) bool { _, ok := err.(*ShumaiError) return ok } // GetShumaiError 获取数脉错误 func GetShumaiError(err error) *ShumaiError { if e, ok := err.(*ShumaiError); ok { return e } return nil }