errs/errs.go

171 lines
2.7 KiB
Go
Raw Permalink Normal View History

2022-06-19 12:34:10 +05:00
// 0.1.2
2022-02-04 01:05:54 +05:00
package errs
import (
"fmt"
2022-05-29 02:39:44 +05:00
"os"
2022-02-04 01:05:54 +05:00
"runtime"
2022-05-29 02:39:44 +05:00
"git.leolab.info/lib/replacer"
2022-02-04 01:05:54 +05:00
)
2022-05-29 02:39:44 +05:00
type ErrCode string
var Silent = false
var StrFmt = "[ERROR] %date% %time% [%code%] %error% at %file%:%line% %func%"
var Trace = false
2022-02-04 01:05:54 +05:00
const (
2022-05-29 02:39:44 +05:00
ErrError ErrCode = "ErrError"
ErrNoError ErrCode = "ErrNoError"
2022-05-29 03:48:32 +05:00
ErrDSError ErrCode = "ErrDSError"
2022-02-04 01:05:54 +05:00
)
2022-06-03 09:40:01 +05:00
type src struct {
2022-02-04 01:05:54 +05:00
File string
2022-05-29 02:39:44 +05:00
Line int
Func string
2022-02-04 01:05:54 +05:00
}
//Структура ошибки
// 0.1.0
2022-02-04 01:05:54 +05:00
type Err struct {
2022-05-29 03:48:32 +05:00
dsId int64
2022-05-29 02:39:44 +05:00
Code ErrCode
Msg string
2022-06-03 09:40:01 +05:00
src src
2022-05-29 02:39:44 +05:00
Prev *Err
2022-02-04 01:05:54 +05:00
}
//Реализация интерфейса error
// 0.1.0
2022-05-29 02:39:44 +05:00
func (e *Err) Error() string {
if e == nil {
panic("NIL Error")
2022-02-04 01:05:54 +05:00
}
2022-05-29 02:39:44 +05:00
return e.Msg
2022-02-04 01:05:54 +05:00
}
2022-06-20 16:46:04 +05:00
//Получить "карту" ошибки
// 0.1.4
func (e *Err) Map() map[string]interface{} {
if e == nil {
panic("NIL Error")
}
ret := map[string]interface{}{
"DSId": e.dsId,
"Code": e.Code,
"Msg": e.Msg,
"Src": map[string]interface{}{
"File": e.src.File,
"Line": e.src.Line,
"Func": e.src.Func,
},
}
if e.Prev != nil {
2022-06-29 19:26:21 +05:00
ret["Prev"] = e.Error()
2022-06-20 16:46:04 +05:00
}
return ret
}
//Создать ошибку
2022-06-20 16:46:04 +05:00
// 0.1.4
func RaiseError(eCode ErrCode, msg string, prev ...*Err) *Err {
2022-05-29 02:39:44 +05:00
e := &Err{
Code: eCode,
Msg: msg,
2022-06-03 09:40:01 +05:00
src: getSrc(2),
2022-05-29 02:39:44 +05:00
Prev: nil,
2022-02-04 01:05:54 +05:00
}
2022-06-20 16:46:04 +05:00
if len(prev) > 0 {
e.Prev = prev[0]
}
2022-06-03 09:40:01 +05:00
e = storeDS(e)
logError(e)
2022-05-29 02:39:44 +05:00
return e
2022-02-04 01:05:54 +05:00
}
//Передать ошибку выше
2022-06-20 16:46:04 +05:00
// 0.1.4
func UpError(err *Err, args ...any) *Err {
2022-05-29 02:39:44 +05:00
e := &Err{
Code: err.Code,
Msg: err.Msg,
2022-06-03 09:40:01 +05:00
src: getSrc(2),
2022-05-29 02:39:44 +05:00
Prev: err,
2022-02-04 01:05:54 +05:00
}
2022-06-20 16:46:04 +05:00
if len(args) > 1 {
for _, a := range args {
switch v := a.(type) {
case string:
e.Msg = v
case ErrCode:
e.Code = v
default:
//Unknown
}
}
}
2022-06-03 09:40:01 +05:00
e = storeDS(e)
if Trace {
2022-06-03 09:40:01 +05:00
logError(e)
}
2022-05-29 02:39:44 +05:00
return e
2022-02-04 01:05:54 +05:00
}
//Преобразовать ошибку
// 0.1.0
2022-05-29 02:39:44 +05:00
func Error(e error) *Err {
err := &Err{
Code: ErrError,
Msg: e.Error(),
2022-06-03 09:40:01 +05:00
src: getSrc(2),
2022-05-29 02:39:44 +05:00
Prev: nil,
2022-02-04 01:05:54 +05:00
}
2022-06-03 09:40:01 +05:00
err = storeDS(err)
logError(err)
2022-05-29 02:39:44 +05:00
return err
2022-02-04 01:05:54 +05:00
}
//Получить источник
// 0.1.0
2022-06-03 09:40:01 +05:00
func getSrc(lvl int) (s src) {
2022-02-04 01:05:54 +05:00
pc, file, line, ok := runtime.Caller(lvl)
if !ok {
2022-06-03 09:40:01 +05:00
return src{File: "undefined", Line: 0, Func: "undefined()"}
2022-02-04 01:05:54 +05:00
}
f := runtime.CallersFrames([]uintptr{pc})
ff, _ := f.Next()
2022-06-03 09:40:01 +05:00
s = src{
2022-02-04 01:05:54 +05:00
File: file,
2022-05-29 02:39:44 +05:00
Line: line,
Func: ff.Function,
2022-02-04 01:05:54 +05:00
}
return s
}
2022-05-29 02:39:44 +05:00
//Получить строку по формату
// 0.1.0
2022-06-03 09:40:01 +05:00
func (e *Err) getString() string {
2022-05-29 02:39:44 +05:00
if e == nil {
panic("Err is NIL")
}
2022-07-01 14:25:32 +05:00
r := replacer.New()
2022-05-29 02:39:44 +05:00
r.Add("code", string(e.Code))
r.Add("file", e.src.File)
r.Add("line", fmt.Sprintf("%v", e.src.Line))
r.Add("func", e.src.Func)
r.Add("error", e.Msg)
return r.ReplaceC(StrFmt)
}
//Вывести ошибку
// 0.1.0
2022-06-03 09:40:01 +05:00
func logError(e *Err) {
storeFS(e)
2022-05-29 02:39:44 +05:00
if Silent {
return
}
2022-06-03 09:40:01 +05:00
fmt.Fprintln(os.Stderr, e.getString())
2022-05-29 02:39:44 +05:00
}