1use num_derive::FromPrimitive;
2use num_traits::FromPrimitive;
3use serde_repr::{Deserialize_repr, Serialize_repr};
4
5const ERR_BASE: i32 = -0x60000000;
6const WRN_BASE: i32 = 0x40000000;
7
8#[repr(i32)]
9#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)]
10pub enum ErrorArea {
11 General = 0,
12 Sdk = 1 << 16,
13 Core = 2 << 16,
14 Igo = 3 << 16,
15 Friends = 4 << 16,
16 Presence = 5 << 16,
17 Commerce = 6 << 16,
18 Achievements = 7 << 16,
19 Lsx = 8 << 16,
20 Proxy = 9 << 16,
21}
22
23#[repr(i32)]
24#[derive(Debug, Clone, Copy, PartialEq, Eq, FromPrimitive)]
25pub enum ErrorLevel {
26 L0 = 0 << 24,
27 L1 = 1 << 24,
28 L2 = 2 << 24,
29 L3 = 3 << 24,
30 L4 = 4 << 24,
31}
32
33const fn make_err(level: ErrorLevel, area: ErrorArea, code: i32) -> i32 {
34 ERR_BASE | (level as i32) | (area as i32) | code
35}
36
37const fn make_wrn(level: ErrorLevel, area: ErrorArea, code: i32) -> i32 {
38 WRN_BASE | (level as i32) | (area as i32) | code
39}
40
41#[derive(Debug, Serialize_repr, Deserialize_repr, Clone, Copy, PartialEq, Eq)]
42#[repr(i32)]
43pub enum OriginError {
44 Success = 0,
45 Pending = 1,
46 General = -1,
47
48 InvalidHandle = make_err(ErrorLevel::L1, ErrorArea::General, 0),
49 OutOfMemory = make_err(ErrorLevel::L0, ErrorArea::General, 1),
50 NotImplemented = make_err(ErrorLevel::L1, ErrorArea::General, 2),
51 InvalidUser = make_err(ErrorLevel::L2, ErrorArea::General, 3),
52 InvalidArgument = make_err(ErrorLevel::L2, ErrorArea::General, 4),
53 NoCallbackSpecified = make_err(ErrorLevel::L2, ErrorArea::General, 5),
54 BufferTooSmall = make_err(ErrorLevel::L2, ErrorArea::General, 6),
55 TooManyValuesInList = make_err(ErrorLevel::L2, ErrorArea::General, 7),
56 NotFound = make_err(ErrorLevel::L2, ErrorArea::General, 8),
57 InvalidPersona = make_err(ErrorLevel::L2, ErrorArea::General, 9),
58 NoNetwork = make_err(ErrorLevel::L2, ErrorArea::General, 10),
59 NoService = make_err(ErrorLevel::L2, ErrorArea::General, 11),
60 NotLoggedIn = make_err(ErrorLevel::L2, ErrorArea::General, 12),
61 MandatoryOriginUpdatePending = make_err(ErrorLevel::L2, ErrorArea::General, 13),
62 AccountInUse = make_err(ErrorLevel::L2, ErrorArea::General, 14),
63 TooManyInstances = make_err(ErrorLevel::L1, ErrorArea::General, 15),
64 AlreadyExists = make_err(ErrorLevel::L3, ErrorArea::General, 16),
65 InvalidOperation = make_err(ErrorLevel::L2, ErrorArea::General, 17),
66 AgeRestricted = make_err(ErrorLevel::L2, ErrorArea::General, 18),
67 Banned = make_err(ErrorLevel::L2, ErrorArea::General, 19),
68 NotReady = make_err(ErrorLevel::L2, ErrorArea::General, 20),
69
70 SdkNotInitialized = make_err(ErrorLevel::L0, ErrorArea::Sdk, 0),
71 SdkInvalidAllocatorDeallocatorCombination = make_err(ErrorLevel::L1, ErrorArea::Sdk, 1),
72 SdkIsRunning = make_err(ErrorLevel::L2, ErrorArea::Sdk, 2),
73 SdkNotAllResourcesReleased = make_err(ErrorLevel::L3, ErrorArea::Sdk, 3),
74 SdkInvalidResource = make_err(ErrorLevel::L2, ErrorArea::Sdk, 4),
75 SdkInternalError = make_err(ErrorLevel::L1, ErrorArea::Sdk, 5),
76 SdkInternalBufferTooSmall = make_err(ErrorLevel::L1, ErrorArea::Sdk, 6),
77
78 WarningSdkAlreadyInitialized = make_wrn(ErrorLevel::L2, ErrorArea::Sdk, 1),
79 WarningSdkStillRunning = make_wrn(ErrorLevel::L2, ErrorArea::Sdk, 2),
80 WarningSdkEnumeratorInUse = make_wrn(ErrorLevel::L2, ErrorArea::Sdk, 3),
81 WarningSdkEnumeratorTerminated = make_wrn(ErrorLevel::L2, ErrorArea::Sdk, 4),
82
83 CoreNotloaded = make_err(ErrorLevel::L0, ErrorArea::Core, 0),
84 CoreLoginFailed = make_err(ErrorLevel::L1, ErrorArea::Core, 1),
85 CoreAuthenticationFailed = make_err(ErrorLevel::L1, ErrorArea::Core, 2),
86 CoreSendFailed = make_err(ErrorLevel::L1, ErrorArea::Core, 4),
87 CoreReceiveFailed = make_err(ErrorLevel::L1, ErrorArea::Core, 5),
88 CoreResourceNotFound = make_err(ErrorLevel::L1, ErrorArea::Core, 6),
89 CoreIncompatibleVersion = make_err(ErrorLevel::L0, ErrorArea::Core, 7),
90 CoreNotInstalled = make_err(ErrorLevel::L0, ErrorArea::Core, 8),
91
92 WarningIgoNotloaded = make_wrn(ErrorLevel::L1, ErrorArea::Igo, 0),
93 WarningIgoSupportNotloaded = make_wrn(ErrorLevel::L1, ErrorArea::Igo, 1),
94 IgoIllegalAnchorPoint = make_err(ErrorLevel::L3, ErrorArea::Igo, 2),
95 IgoIllegalDockPoint = make_err(ErrorLevel::L3, ErrorArea::Igo, 3),
96 IgoNotAvailable = make_err(ErrorLevel::L3, ErrorArea::Igo, 4),
97
98 NoMultiplayerId = make_err(ErrorLevel::L2, ErrorArea::Presence, 0),
99
100 LsxInvalidResponse = make_err(ErrorLevel::L2, ErrorArea::Lsx, 0),
101 LsxNoResponse = make_err(ErrorLevel::L1, ErrorArea::Lsx, 1),
102 LsxInvalidRequest = make_err(ErrorLevel::L2, ErrorArea::Lsx, 2),
103
104 CommerceNoSuchStore = make_err(ErrorLevel::L1, ErrorArea::Commerce, 0),
105 CommerceNoSuchCatalog = make_err(ErrorLevel::L1, ErrorArea::Commerce, 1),
106 CommerceInvalidReply = make_err(ErrorLevel::L1, ErrorArea::Commerce, 2),
107 CommerceNoCategories = make_err(ErrorLevel::L2, ErrorArea::Commerce, 3),
108 CommerceNoProducts = make_err(ErrorLevel::L2, ErrorArea::Commerce, 4),
109 CommerceUnderageUser = make_err(ErrorLevel::L2, ErrorArea::Commerce, 5),
110 CommerceDeprecatedStore = make_err(ErrorLevel::L2, ErrorArea::Commerce, 6),
111
112 Proxy = make_err(ErrorLevel::L2, ErrorArea::Proxy, 0),
113 SuccessProxyOk = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 200),
114 SuccessProxyCreated = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 201),
115 SuccessProxyAccepted = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 202),
116 SuccessProxyNonAuthInfo = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 203),
117 SuccessProxyNoContent = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 204),
118 SuccessResetContent = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 205),
119 SuccessPartialContent = make_wrn(ErrorLevel::L4, ErrorArea::Proxy, 206),
120 ProxyBadRequest = make_err(ErrorLevel::L2, ErrorArea::Proxy, 400),
121 ProxyUnauthorized = make_err(ErrorLevel::L2, ErrorArea::Proxy, 401),
122 ProxyPaymentRequired = make_err(ErrorLevel::L2, ErrorArea::Proxy, 402),
123 ProxyForbidden = make_err(ErrorLevel::L2, ErrorArea::Proxy, 403),
124 ProxyNotFound = make_err(ErrorLevel::L2, ErrorArea::Proxy, 404),
125 ProxyMethodNotAllowed = make_err(ErrorLevel::L2, ErrorArea::Proxy, 405),
126 ProxyNotAcceptable = make_err(ErrorLevel::L2, ErrorArea::Proxy, 406),
127 ProxyRequestTimeout = make_err(ErrorLevel::L2, ErrorArea::Proxy, 408),
128 ProxyConflict = make_err(ErrorLevel::L2, ErrorArea::Proxy, 409),
129 ProxyInternalError = make_err(ErrorLevel::L2, ErrorArea::Proxy, 500),
130 ProxyNotImplemented = make_err(ErrorLevel::L2, ErrorArea::Proxy, 501),
131 ProxyBadGateway = make_err(ErrorLevel::L2, ErrorArea::Proxy, 502),
132 ProxyServiceUnavailable = make_err(ErrorLevel::L2, ErrorArea::Proxy, 503),
133 ProxyGatewayTimeout = make_err(ErrorLevel::L2, ErrorArea::Proxy, 504),
134}
135
136impl OriginError {
137 pub const fn is_success(&self) -> bool {
139 matches!(self, OriginError::Success | OriginError::Pending)
140 }
141
142 pub const fn is_warning(&self) -> bool {
144 (*self as i32) > 1
145 }
146
147 pub const fn is_error(&self) -> bool {
149 (*self as i32) < 0
150 }
151
152 pub fn error_area(&self) -> Option<ErrorArea> {
154 ErrorArea::from_i32((*self as i32) & 0x00FF0000)
155 }
156
157 pub fn error_level(&self) -> Option<ErrorLevel> {
159 ErrorLevel::from_i32((*self as i32) & 0x0F000000)
160 }
161
162 pub const fn error_code(&self) -> i32 {
164 (*self as i32) & 0x0000FFFF
165 }
166}