70 lines
2.1 KiB
Go
70 lines
2.1 KiB
Go
package kernel
|
|
|
|
// 业务信封 code:成功为 0;失败默认等于 HTTP 状态。需要区分同一状态的不同原因时,用 status*100+n。
|
|
// 不使用与 HTTP 无关的 1001/2001 号段,避免和现有 42901 以及前端按 status/code 判断重试打架。
|
|
const (
|
|
CodeOK = 0
|
|
|
|
CodeInvalidArgument = 400
|
|
CodeUnauthorized = 401
|
|
CodeForbidden = 403
|
|
CodeNotFound = 404
|
|
CodeConflict = 409
|
|
CodeTooManyRequests = 429
|
|
CodeInternal = 500
|
|
CodeBadGateway = 502
|
|
CodeUnavailable = 503
|
|
CodeTimeout = 504
|
|
|
|
CodeQuotaExceeded = 40301
|
|
CodeIdempotencyConflict = 40901
|
|
CodeRateLimited = 42901
|
|
)
|
|
|
|
// ErrorReason 是稳定机器可读原因,前端应判断 reason 而不是解析 msg。
|
|
type ErrorReason string
|
|
|
|
const (
|
|
ReasonInvalidArgument ErrorReason = "invalid_argument"
|
|
ReasonUnauthorized ErrorReason = "unauthorized"
|
|
ReasonForbidden ErrorReason = "forbidden"
|
|
ReasonNotFound ErrorReason = "not_found"
|
|
ReasonConflict ErrorReason = "conflict"
|
|
ReasonFailedPrecondition ErrorReason = "failed_precondition"
|
|
ReasonQuotaExceeded ErrorReason = "quota_exceeded"
|
|
ReasonRateLimited ErrorReason = "rate_limited"
|
|
ReasonUnavailable ErrorReason = "unavailable"
|
|
ReasonTimeout ErrorReason = "timeout"
|
|
ReasonInternal ErrorReason = "internal"
|
|
ReasonBadGateway ErrorReason = "bad_gateway"
|
|
ReasonUpstreamDNSFailed ErrorReason = "upstream_dns_failed"
|
|
)
|
|
|
|
func ReasonForStatus(status int) ErrorReason {
|
|
switch status {
|
|
case CodeInvalidArgument:
|
|
return ReasonInvalidArgument
|
|
case CodeUnauthorized:
|
|
return ReasonUnauthorized
|
|
case CodeForbidden:
|
|
return ReasonForbidden
|
|
case CodeNotFound:
|
|
return ReasonNotFound
|
|
case CodeConflict:
|
|
return ReasonConflict
|
|
case CodeTooManyRequests:
|
|
return ReasonRateLimited
|
|
case CodeBadGateway:
|
|
return ReasonBadGateway
|
|
case CodeUnavailable:
|
|
return ReasonUnavailable
|
|
case CodeTimeout:
|
|
return ReasonTimeout
|
|
default:
|
|
if status >= 500 {
|
|
return ReasonInternal
|
|
}
|
|
return ReasonInvalidArgument
|
|
}
|
|
}
|