package common import ( "fmt" "log/slog" ) import ( "github.com/gin-gonic/gin" "github.com/nicksnyder/go-i18n/v2/i18n" "github.com/spf13/cast" ) const OKCode = "0x000000" const InvalidTokenCode = "0x010101" const InvalidRoleCode = "0x010102" type ResDesc string var ( // 全局 Success ResDesc = "ErrCode_Success" InvalidTokenError ResDesc = "ErrCode_InvalidTokenError" InvalidRoleError ResDesc = "ErrCode_InvalidRoleError" InvalidParamError ResDesc = "ErrCode_InvalidParamError" NotExistsError ResDesc = "ErrCode_NotExistsError" NotSupportError ResDesc = "ErrCode_NotSupportError" NoAuthError ResDesc = "ErrCode_NoAuthError" ExistsError ResDesc = "ErrCode_ExistsError" NotAvailableError ResDesc = "ErrCode_NotAvailableError" UnknownError ResDesc = "ErrCode_UnknownError" InvalidLanguageError ResDesc = "ErrCode_InvalidLanguageError" InvalidSourceError ResDesc = "ErrCode_InvalidSourceError" InvalidProductError ResDesc = "ErrCode_InvalidProductError" // 业务 错误 InvalidIdError ResDesc = "InvalidIdError" FieldTypeError ResDesc = "FieldTypeError" ) var ( OK = &ResStatus{Code: "0x000000", Description: Success, Solution: ""} InvalidToken = &ResStatus{Code: "0x000101", Description: InvalidTokenError, Solution: ""} InvalidRole = &ResStatus{Code: "0x000102", Description: InvalidRoleError, Solution: ""} InvalidParam = &ResStatus{Code: "0x000103", Description: InvalidParamError, Solution: ""} NotExists = &ResStatus{Code: "0x000104", Description: NotExistsError, Solution: ""} NotSupport = &ResStatus{Code: "0x000105", Description: NotSupportError, Solution: ""} NoAuth = &ResStatus{Code: "0x000106", Description: NoAuthError, Solution: ""} Exists = &ResStatus{Code: "0x000107", Description: ExistsError, Solution: ""} NotAvailable = &ResStatus{Code: "0x000108", Description: NotAvailableError, Solution: ""} InvalidLanguage = &ResStatus{Code: "0x000111", Description: InvalidLanguageError, Solution: ""} InvalidSource = &ResStatus{Code: "0x000112", Description: InvalidSourceError, Solution: ""} InvalidProduct = &ResStatus{Code: "0x000113", Description: InvalidProductError, Solution: ""} InvalidUsernameOrPasswd = &ResStatus{Code: "0x010101", Description: "ErrCode_InvalidUsernameOrPasswdError", Solution: ""} Unknown = &ResStatus{Code: "0x999999", Description: UnknownError, Solution: ""} ) func helper(code string, msg ResDesc) *ResStatus { return &ResStatus{ Code: code, Description: msg, Solution: "", } } type ResStatus struct { Code string `json:"code"` Description ResDesc `json:"description"` Params map[string]interface{} `json:"-"` Solution string `json:"solution"` } func (p *ResStatus) Error() string { return string(p.Description) } func (p *ResStatus) Desc(msg ResDesc) *ResStatus { return &ResStatus{p.Code, msg, nil, p.Solution} } func convertParamsToMap(params ...interface{}) map[string]interface{} { result := make(map[string]interface{}) for i := 0; i < len(params); i += 2 { var value interface{} if i+1 < len(params) { value = params[i+1] } else { value = nil } result[cast.ToString(params[i])] = value } return result } func (p *ResStatus) SetParam(params ...interface{}) *ResStatus { return &ResStatus{p.Code, p.Description, convertParamsToMap(params), p.Solution} } func (p *ResStatus) Translator(localizer *i18n.Localizer) *ResStatus { params := []string{} if len(p.Params) > 0 { for _, param := range p.Params { params = append(params, fmt.Sprintf("%v", param)) } } t, err := localizer.Localize(&i18n.LocalizeConfig{ MessageID: string(p.Description), TemplateData: params, }) if err != nil { slog.Error("translator fail\n", "desc", p.Description, "err", err) t = string(p.Description) } return &ResStatus{p.Code, ResDesc(t), p.Params, p.Solution} } func (p *ResStatus) H(data ...interface{}) gin.H { if len(data) > 0 { return gin.H{"status": helper(p.Code, p.Description), "data": data[0]} } return gin.H{"status": helper(p.Code, p.Description), "data": gin.H{}} }