// Package errcode 定义跨系统共用的错误码契约。 // // 码格式为「域.助记名」(domain.mnemonic)。本包不依赖 HTTP、日志或任何产品类型: // 调用方用 Registry 登记定义,用 E 携带码在进程内传递,用 JSON 跨进程传输。 // 未知码必须经 Registry.Resolve 回落到 sys.unknown_code,不得静默当成成功。 package errcode import ( "fmt" "regexp" "strings" ) // 域 2–32 字符,助记名 2–64 字符。域允许连字符,助记名允许下划线。 var codePattern = regexp.MustCompile(`^[a-z][a-z0-9-]{1,31}\.[a-z][a-z0-9_]{1,63}$`) // Code 是已规范化的错误码。空字符串不是合法码。 type Code string // Valid 报告码是否符合 domain.mnemonic 格式。 func (c Code) Valid() bool { return codePattern.MatchString(string(c)) } // Domain 返回点号前的域;格式不合法时返回空字符串。 func (c Code) Domain() string { d, _, ok := strings.Cut(string(c), ".") if !ok || !c.Valid() { return "" } return d } // Mnemonic 返回点号后的助记名;格式不合法时返回空字符串。 func (c Code) Mnemonic() string { _, m, ok := strings.Cut(string(c), ".") if !ok || !c.Valid() { return "" } return m } func (c Code) String() string { return string(c) } // ParseCode 校验并返回码。 func ParseCode(s string) (Code, error) { c := Code(s) if !c.Valid() { return "", fmt.Errorf("errcode: invalid code %q", s) } return c, nil }