-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtypes_errors.go
49 lines (40 loc) · 1.84 KB
/
types_errors.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
package f8n
import "fmt"
type (
// Error Объект-одиночка со списком ошибок которые можно сравнивать по якорю через '=='.
Error struct{}
// Внутренняя структура объекта ошибки с кодом, шаблоном, якорем и интерфейсом error.
err struct {
tpl string // Шаблон ошибки.
code uint8 // Код ошибки.
args []any // Иные аргументы ошибки.
anchor error // Константа ошибки с фиксированным адресом.
errFn func() string // Функция интерфейса error.
}
// Err Интерфейс ошибки приложения.
Err interface {
Anchor() error // Якорь, по которому можно сравнивать две ошибки между собой.
Code() uint8 // Код ошибки.
Error() string // Сообщение об ошибке или шаблон сообщения об ошибке.
}
)
// Anchor Реализация интерфейса error.
func (err err) Anchor() error { return err.anchor }
// Code Возврат кода ошибки.
func (err err) Code() uint8 { return err.code }
// Error Реализация интерфейса error.
func (err err) Error() string { return err.errFn() }
// Errors Справочник ошибок.
func Errors() *Error { return errSingleton }
// Конструктор объекта ошибки.
func newErr(obj *err, code uint8, arg ...any) Err {
if code == 0 {
code = obj.code // Если код ошибки не изменён, используется код ошибки из шаблона.
}
return &err{
anchor: obj,
code: code,
args: arg,
errFn: func() string { return fmt.Sprintf(obj.tpl, arg...) },
}
}