-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathunwrap.go
More file actions
95 lines (77 loc) · 1.96 KB
/
unwrap.go
File metadata and controls
95 lines (77 loc) · 1.96 KB
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
// Copyright 2024 FishGoddess. All rights reserved.
// Use of this source code is governed by a MIT style
// license that can be found in the LICENSE file.
package errors
import "fmt"
// Code unwraps error and gets code of it.
// It returns 0 if err is nil.
// It returns defaultCode if err doesn't have a code.
func Code(err error, defaultCode int32) int32 {
if err == nil {
return 0
}
cerr, ok := err.(interface {
Code() int32
})
if ok {
return cerr.Code()
}
var xerr *Error
if As(err, &xerr) {
return xerr.Code()
}
return defaultCode
}
// Message unwraps error and gets message of it.
// It returns "" if err is nil.
// It returns defaultMessage if err doesn't have a message.
func Message(err error, defaultMessage string, args ...any) string {
if err == nil {
return ""
}
merr, ok := err.(interface {
Message() string
})
if ok {
return merr.Message()
}
var xerr *Error
if As(err, &xerr) {
return xerr.Message()
}
if len(args) > 0 {
defaultMessage = fmt.Sprintf(defaultMessage, args...)
}
return defaultMessage
}
// CodeMessage unwraps error and gets code & message of it.
// It returns 0 & "" if err is nil.
// It returns defaultCode if err doesn't have a code.
// It returns defaultMessage if err doesn't have a message.
func CodeMessage(err error, defaultCode int32, defaultMessage string, args ...any) (int32, string) {
code := Code(err, defaultCode)
message := Message(err, defaultMessage, args...)
return code, message
}
// IsCode unwraps error and check if its code equals to code.
func IsCode(err error, code int32) bool {
if err == nil {
return code == 0
}
cerr, ok := err.(interface {
Code() int32
})
if ok {
return cerr.Code() == code
}
var xerr *Error
if As(err, &xerr) {
return xerr.Code() == code
}
return false
}
// Match unwraps error and check if its code equals to code.
// Deprecated: Use IsCode instead because this name is 'ugly' to me.
func Match(err error, code int32) bool {
return IsCode(err, code)
}