package core import ( "fmt" "log/slog" "platform/pkg/env" "runtime" ) type Err struct { msg string err error errFile string errLine int errFunc string } func (e *Err) Error() string { if e.err != nil { slog.Debug(fmt.Sprintf("%s: %s", e.msg, e.err.Error())) } return e.msg } func (e *Err) Unwrap() error { return e.err } func (e *Err) Source() *slog.Source { return &slog.Source{ Function: e.errFunc, File: e.errFile, Line: e.errLine, } } func newErr(msg string, err ...error) Err { o := Err{ msg: msg, } if len(err) > 0 { o.err = err[0] } if env.RunMode == env.RunModeDev { pc, file, line, ok := runtime.Caller(2) if ok { o.errFile = file o.errLine = line o.errFunc = runtime.FuncForPC(pc).Name() } } return o } type BizErr struct{ Err } func NewBizErr(msg string, err ...error) (biz *BizErr) { return &BizErr{newErr(msg, err...)} } type ServErr struct{ Err } func NewServErr(msg string, err ...error) *ServErr { return &ServErr{newErr(msg, err...)} }