代码拉取完成,页面将自动刷新
package gcodes
import (
"fmt"
"io"
"strconv"
"strings"
)
var (
OK = NewCode(0, "ok")
Canceled = NewCode(1, "canceled")
Unknown = NewCode(2, "unknown")
InvalidArgument = NewCode(3, "invalid argument")
DeadlineExceeded = NewCode(4, "deadline exceeded")
NotFound = NewCode(5, "not found")
InternalError = NewCode(6, "internal error")
Unauthorized = NewCode(7, "unauthorized")
IllegalInvoke = NewCode(8, "illegal invoke")
IllegalRequest = NewCode(9, "illegal request")
)
type Code struct {
code int
message string
redirect string
}
// NewCode 新建一个错误码
func NewCode(code int, message ...string) *Code {
if len(message) > 0 {
return &Code{code: code, message: message[0]}
} else {
return &Code{code: code}
}
}
// Code 返回错误码
func (c *Code) Code() int {
return c.code
}
func (c *Code) Redirect() string {
return c.redirect
}
// WithCode 替换新的错误码
func (c *Code) WithCode(code int) *Code {
return &Code{
code: code,
message: c.message,
}
}
func (c *Code) WithRedirect(to string) *Code {
return &Code{
code: c.code,
message: c.message,
redirect: to,
}
}
// Message 返回错误码消息
func (c *Code) Message() string {
return c.message
}
// WithMessage 替换新的错误码消息
func (c *Code) WithMessage(message string) *Code {
return &Code{
code: c.code,
message: message,
}
}
// String 格式化错误码
func (c *Code) String() string {
return fmt.Sprintf("code error: code = %d desc = %s", c.code, c.message)
}
// Format 格式化输出
// %s : 打印错误码和错误消息
// %v : 打印错误码、错误消息、错误详情
func (c *Code) Format(s fmt.State, verb rune) {
switch verb {
case 's':
if c.message != "" {
io.WriteString(s, fmt.Sprintf("%d:%s", c.code, c.message))
} else {
io.WriteString(s, fmt.Sprintf("%d", c.code))
}
case 'v':
io.WriteString(s, c.String())
}
}
// Err 转错误消息
func (c *Code) Err() error {
if c.code == OK.Code() {
return nil
}
return &Error{code: c}
}
type Error struct {
code *Code
}
// Error error interface implementation
func (e *Error) Error() string {
return e.code.String()
}
// Convert 将错误信息转换为错误码
func Convert(err error) (*Code, bool) {
if err == nil {
return OK, false
}
if e, ok := err.(interface{ Code() *Code }); ok {
return e.Code(), true
}
text := err.Error()
flag := "code error:"
index := strings.Index(text, flag)
if index == -1 {
return Unknown, false
}
after, found := strings.CutPrefix(text[index+len(flag):], " code = ")
if !found {
return Unknown, false
}
elements := strings.SplitN(after, " ", 2)
if len(elements) != 2 {
return Unknown, false
}
code, err := strconv.Atoi(elements[0])
if err != nil {
return Unknown, false
}
after, found = strings.CutPrefix(elements[1], "desc = ")
if !found {
return Unknown, false
}
return NewCode(code, after), true
}
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。