Skip to main content

origin_sdk/protocol/
errors.rs

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    /// Returns true if this is a success code (0) or pending (1)
138    pub const fn is_success(&self) -> bool {
139        matches!(self, OriginError::Success | OriginError::Pending)
140    }
141
142    /// Returns true if this is a warning
143    pub const fn is_warning(&self) -> bool {
144        (*self as i32) > 1
145    }
146
147    /// Returns true if this is an error
148    pub const fn is_error(&self) -> bool {
149        (*self as i32) < 0
150    }
151
152    /// Extract the error area from the error code
153    pub fn error_area(&self) -> Option<ErrorArea> {
154        ErrorArea::from_i32((*self as i32) & 0x00FF0000)
155    }
156
157    /// Extract the error level from the error code
158    pub fn error_level(&self) -> Option<ErrorLevel> {
159        ErrorLevel::from_i32((*self as i32) & 0x0F000000)
160    }
161
162    /// Extract the specific error code within the area
163    pub const fn error_code(&self) -> i32 {
164        (*self as i32) & 0x0000FFFF
165    }
166}