forked from zitadel/zitadel
-
Notifications
You must be signed in to change notification settings - Fork 0
/
caos_error.go
81 lines (67 loc) · 1.43 KB
/
caos_error.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
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
package errors
import (
"errors"
"fmt"
"reflect"
)
var _ Error = (*CaosError)(nil)
type CaosError struct {
Parent error
Message string
ID string
}
func ThrowError(parent error, id, message string) error {
return CreateCaosError(parent, id, message)
}
func CreateCaosError(parent error, id, message string) *CaosError {
return &CaosError{
Parent: parent,
ID: id,
Message: message,
}
}
func (err *CaosError) Error() string {
if err.Parent != nil {
return fmt.Sprintf("ID=%s Message=%s Parent=(%v)", err.ID, err.Message, err.Parent)
}
return fmt.Sprintf("ID=%s Message=%s", err.ID, err.Message)
}
func (err *CaosError) Unwrap() error {
return err.GetParent()
}
func (err *CaosError) GetParent() error {
return err.Parent
}
func (err *CaosError) GetMessage() string {
return err.Message
}
func (err *CaosError) SetMessage(msg string) {
err.Message = msg
}
func (err *CaosError) GetID() string {
return err.ID
}
func (err *CaosError) Is(target error) bool {
t, ok := target.(*CaosError)
if !ok {
return false
}
if t.ID != "" && t.ID != err.ID {
return false
}
if t.Message != "" && t.Message != err.Message {
return false
}
if t.Parent != nil && !errors.Is(err.Parent, t.Parent) {
return false
}
return true
}
func (err *CaosError) As(target interface{}) bool {
_, ok := target.(**CaosError)
if !ok {
return false
}
reflect.Indirect(reflect.ValueOf(target)).Set(reflect.ValueOf(err))
return true
}