-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherrors.go
144 lines (118 loc) · 3.37 KB
/
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
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
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
package cpe
import (
"fmt"
)
// ErrorType 表示CPE错误类型
type ErrorType int
const (
// ErrorTypeParsingFailed 解析失败
ErrorTypeParsingFailed ErrorType = iota
// ErrorTypeInvalidFormat 无效格式
ErrorTypeInvalidFormat
// ErrorTypeInvalidPart 无效Part值
ErrorTypeInvalidPart
// ErrorTypeInvalidAttribute 无效属性值
ErrorTypeInvalidAttribute
// ErrorTypeNotFound 未找到
ErrorTypeNotFound
// ErrorTypeOperationFailed 操作失败
ErrorTypeOperationFailed
)
// CPEError 表示CPE操作错误
type CPEError struct {
// 错误类型
Type ErrorType
// 错误信息
Message string
// 相关CPE字符串
CPEString string
// 原始错误(可选)
Err error
}
// Error 实现error接口
func (e *CPEError) Error() string {
if e.CPEString != "" {
return fmt.Sprintf("%s: %s", e.Message, e.CPEString)
}
return e.Message
}
// Unwrap 解包原始错误
func (e *CPEError) Unwrap() error {
return e.Err
}
// NewParsingError 创建解析错误
func NewParsingError(cpeString string, err error) *CPEError {
return &CPEError{
Type: ErrorTypeParsingFailed,
Message: "failed to parse CPE string",
CPEString: cpeString,
Err: err,
}
}
// NewInvalidFormatError 创建无效格式错误
func NewInvalidFormatError(cpeString string) *CPEError {
return &CPEError{
Type: ErrorTypeInvalidFormat,
Message: "invalid CPE format",
CPEString: cpeString,
}
}
// NewInvalidPartError 创建无效Part错误
func NewInvalidPartError(part string) *CPEError {
return &CPEError{
Type: ErrorTypeInvalidPart,
Message: fmt.Sprintf("invalid CPE part: %s", part),
}
}
// NewInvalidAttributeError 创建无效属性错误
func NewInvalidAttributeError(attribute, value string) *CPEError {
return &CPEError{
Type: ErrorTypeInvalidAttribute,
Message: fmt.Sprintf("invalid value for attribute %s: %s", attribute, value),
}
}
// NewNotFoundError 创建未找到错误
func NewNotFoundError(what string) *CPEError {
return &CPEError{
Type: ErrorTypeNotFound,
Message: fmt.Sprintf("%s not found", what),
}
}
// NewOperationFailedError 创建操作失败错误
func NewOperationFailedError(operation string, err error) *CPEError {
return &CPEError{
Type: ErrorTypeOperationFailed,
Message: fmt.Sprintf("operation %s failed", operation),
Err: err,
}
}
// IsParsingError 检查是否为解析错误
func IsParsingError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeParsingFailed
}
// IsInvalidFormatError 检查是否为无效格式错误
func IsInvalidFormatError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeInvalidFormat
}
// IsInvalidPartError 检查是否为无效Part错误
func IsInvalidPartError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeInvalidPart
}
// IsInvalidAttributeError 检查是否为无效属性错误
func IsInvalidAttributeError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeInvalidAttribute
}
// IsNotFoundError 检查是否为未找到错误
func IsNotFoundError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeNotFound
}
// IsOperationFailedError 检查是否为操作失败错误
func IsOperationFailedError(err error) bool {
cpeErr, ok := err.(*CPEError)
return ok && cpeErr.Type == ErrorTypeOperationFailed
}