-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy patherrors.go
145 lines (127 loc) · 3.93 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
145
package bridge
import "fmt"
// BridgeError represents a base error type for bridge-related errors
type BridgeError struct {
Op string // Operation that failed
Message string // Human-readable error message
Err error // Underlying error if any
}
func (e *BridgeError) Error() string {
if e.Err != nil {
return fmt.Sprintf("%s: %s: %v", e.Op, e.Message, e.Err)
}
return fmt.Sprintf("%s: %s", e.Op, e.Message)
}
func (e *BridgeError) Unwrap() error {
return e.Err
}
// Is implements the interface for errors.Is functionality
func (e *BridgeError) Is(target error) bool {
t, ok := target.(*BridgeError)
if !ok {
return false
}
return e.Message == t.Message
}
// SessionError represents session-specific errors
type SessionError struct {
BridgeError
SessionID string
}
func (e *SessionError) Error() string {
if e.Err != nil {
return fmt.Sprintf("%s: session %s: %s: %v", e.Op, e.SessionID, e.Message, e.Err)
}
return fmt.Sprintf("%s: session %s: %s", e.Op, e.SessionID, e.Message)
}
// Is implements the interface for errors.Is functionality
func (e *SessionError) Is(target error) bool {
t, ok := target.(*SessionError)
if !ok {
return false
}
return e.Message == t.Message
}
// Specific error types for different scenarios
var (
ErrSessionActive = &SessionError{BridgeError: BridgeError{Message: "session is already active"}}
ErrSessionNotFound = &SessionError{BridgeError: BridgeError{Message: "session not found"}}
ErrInvalidSession = &SessionError{BridgeError: BridgeError{Message: "invalid session"}}
ErrSessionSuspended = &SessionError{BridgeError: BridgeError{Message: "session is suspended"}}
ErrUnauthorized = &SessionError{BridgeError: BridgeError{Message: "unauthorized operation"}}
ErrConnectionFailed = &SessionError{BridgeError: BridgeError{Message: "failed to create connection"}}
// Additional error types
ErrGeneric = &SessionError{BridgeError: BridgeError{Message: "error"}}
ErrSessionClosed = &SessionError{BridgeError: BridgeError{Message: "session is closed"}}
ErrInvalidState = &SessionError{BridgeError: BridgeError{Message: "invalid session state"}}
ErrSessionExpired = &SessionError{BridgeError: BridgeError{Message: "session has expired"}}
ErrMaxSessions = &SessionError{BridgeError: BridgeError{Message: "maximum number of sessions reached"}}
)
// Error constructors for common operations
func NewSessionActiveError(sessionID string) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrSessionActive.Message,
},
SessionID: sessionID,
}
}
func NewSessionNotFoundError(sessionID string) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrSessionNotFound.Message,
},
SessionID: sessionID,
}
}
func NewInvalidSessionError(sessionID string) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrInvalidSession.Message,
},
SessionID: sessionID,
}
}
func NewSessionSuspendedError(sessionID string) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrSessionSuspended.Message,
},
SessionID: sessionID,
}
}
func NewUnauthorizedError(sessionID string) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrUnauthorized.Message,
},
SessionID: sessionID,
}
}
func NewConnectionFailedError(sessionID string, err error) error {
return &SessionError{
BridgeError: BridgeError{
Op: "dial",
Message: ErrConnectionFailed.Message,
Err: err,
},
SessionID: sessionID,
}
}
// Helper function to create a generic bridge error
func NewBridgeError(op, message string, err error) error {
return &BridgeError{
Op: op,
Message: message,
Err: err,
}
}
// NewInvalidStateError creates a new error for invalid session state
func NewInvalidStateError(sessionID string) error {
return NewBridgeError("suspend", fmt.Sprintf("session %s is not active", sessionID), nil)
}