|
|
|
// Copyright 2022 ROC. All rights reserved.
|
|
|
|
// Use of this source code is governed by a MIT style
|
|
|
|
// license that can be found in the LICENSE file.
|
|
|
|
|
|
|
|
package xerror
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
"net/http"
|
|
|
|
"strings"
|
|
|
|
|
|
|
|
"github.com/alimy/mir/v4"
|
|
|
|
)
|
|
|
|
|
|
|
|
var (
|
|
|
|
_ mir.Error = (*Error)(nil)
|
|
|
|
|
|
|
|
// codes = map[int]string{}
|
|
|
|
)
|
|
|
|
|
|
|
|
type Error struct {
|
|
|
|
code int
|
|
|
|
msg string
|
|
|
|
details []string
|
|
|
|
}
|
|
|
|
|
|
|
|
type ValidError struct {
|
|
|
|
Message string
|
|
|
|
}
|
|
|
|
|
|
|
|
type ValidErrors []*ValidError
|
|
|
|
|
|
|
|
func (v *ValidError) Error() string {
|
|
|
|
return v.Message
|
|
|
|
}
|
|
|
|
|
|
|
|
func (v ValidErrors) Error() string {
|
|
|
|
return strings.Join(v.Errors(), ",")
|
|
|
|
}
|
|
|
|
|
|
|
|
func (v ValidErrors) Errors() []string {
|
|
|
|
var errs []string
|
|
|
|
for _, err := range v {
|
|
|
|
errs = append(errs, err.Error())
|
|
|
|
}
|
|
|
|
return errs
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewError(code int, msg string) *Error {
|
|
|
|
// if _, ok := codes[code]; ok {
|
|
|
|
// panic(fmt.Sprintf("错误码 %d 已经存在,请更换一个", code))
|
|
|
|
// }
|
|
|
|
// codes[code] = msg
|
|
|
|
return &Error{code: code, msg: msg}
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) Error() string {
|
|
|
|
return fmt.Sprintf("错误码: %d, 错误信息: %s", e.StatusCode(), e.Msg())
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) StatusCode() int {
|
|
|
|
return e.code
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) Msg() string {
|
|
|
|
return e.msg
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) Msgf(args []any) string {
|
|
|
|
return fmt.Sprintf(e.msg, args...)
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) Details() []string {
|
|
|
|
return e.details
|
|
|
|
}
|
|
|
|
|
|
|
|
func (e *Error) WithDetails(details ...string) *Error {
|
|
|
|
newError := *e
|
|
|
|
newError.details = []string{}
|
|
|
|
newError.details = append(newError.details, details...)
|
|
|
|
|
|
|
|
return &newError
|
|
|
|
}
|
|
|
|
|
|
|
|
func HttpStatusCode(e mir.Error) int {
|
|
|
|
switch e.StatusCode() {
|
|
|
|
case Success.StatusCode():
|
|
|
|
return http.StatusOK
|
|
|
|
case ServerError.StatusCode():
|
|
|
|
return http.StatusInternalServerError
|
|
|
|
case InvalidParams.StatusCode():
|
|
|
|
return http.StatusBadRequest
|
|
|
|
case UnauthorizedAuthNotExist.StatusCode():
|
|
|
|
fallthrough
|
|
|
|
case UnauthorizedAuthFailed.StatusCode():
|
|
|
|
fallthrough
|
|
|
|
case UnauthorizedTokenError.StatusCode():
|
|
|
|
fallthrough
|
|
|
|
case UnauthorizedTokenGenerate.StatusCode():
|
|
|
|
fallthrough
|
|
|
|
case UnauthorizedTokenTimeout.StatusCode():
|
|
|
|
return http.StatusUnauthorized
|
|
|
|
case TooManyRequests.StatusCode():
|
|
|
|
return http.StatusTooManyRequests
|
|
|
|
}
|
|
|
|
return http.StatusInternalServerError
|
|
|
|
}
|