Skip to main content

goud_engine/core/error/
reverse_mapping.rs

1//! Reverse mapping from FFI error codes back to `GoudError` variants.
2
3use super::codes::{
4    GoudErrorCode, ERR_ALREADY_INITIALIZED, ERR_AUDIO_INIT_FAILED, ERR_BACKEND_NOT_SUPPORTED,
5    ERR_BUFFER_CREATION_FAILED, ERR_COMPONENT_ALREADY_EXISTS, ERR_COMPONENT_NOT_FOUND,
6    ERR_CONTEXT_DESTROYED, ERR_DRAW_CALL_FAILED, ERR_ENTITY_ALREADY_EXISTS, ERR_ENTITY_NOT_FOUND,
7    ERR_HANDLE_EXPIRED, ERR_HANDLE_TYPE_MISMATCH, ERR_INITIALIZATION_FAILED,
8    ERR_INPUT_DEVICE_NOT_FOUND, ERR_INTERNAL_ERROR, ERR_INVALID_CONTEXT, ERR_INVALID_HANDLE,
9    ERR_INVALID_INPUT_ACTION, ERR_INVALID_STATE, ERR_NOT_IMPLEMENTED, ERR_NOT_INITIALIZED,
10    ERR_PHYSICS_INIT_FAILED, ERR_PLATFORM_ERROR, ERR_PROVIDER_OPERATION_FAILED, ERR_QUERY_FAILED,
11    ERR_RENDER_TARGET_FAILED, ERR_RESOURCE_ALREADY_EXISTS, ERR_RESOURCE_INVALID_FORMAT,
12    ERR_RESOURCE_LOAD_FAILED, ERR_RESOURCE_NOT_FOUND, ERR_SHADER_COMPILATION_FAILED,
13    ERR_SHADER_LINK_FAILED, ERR_TEXTURE_CREATION_FAILED, ERR_WINDOW_CREATION_FAILED, SUCCESS,
14};
15use super::types::GoudError;
16
17impl GoudError {
18    /// Constructs a `GoudError` from an FFI error code.
19    ///
20    /// Returns `None` for [`SUCCESS`] (code 0) and for unknown error codes.
21    /// For variants that carry a `String` payload, the returned error uses an
22    /// empty string -- callers should populate the message separately if needed
23    /// (e.g., via `last_error_message()`).
24    ///
25    /// # Example
26    ///
27    /// ```
28    /// use goud_engine::core::error::{GoudError, ERR_NOT_INITIALIZED, SUCCESS};
29    ///
30    /// assert_eq!(
31    ///     GoudError::from_error_code(ERR_NOT_INITIALIZED),
32    ///     Some(GoudError::NotInitialized),
33    /// );
34    /// assert_eq!(GoudError::from_error_code(SUCCESS), None);
35    /// ```
36    pub fn from_error_code(code: GoudErrorCode) -> Option<Self> {
37        match code {
38            SUCCESS => None,
39
40            // Context errors (1-99)
41            ERR_NOT_INITIALIZED => Some(GoudError::NotInitialized),
42            ERR_ALREADY_INITIALIZED => Some(GoudError::AlreadyInitialized),
43            ERR_INVALID_CONTEXT => Some(GoudError::InvalidContext),
44            ERR_CONTEXT_DESTROYED => Some(GoudError::ContextDestroyed),
45            ERR_INITIALIZATION_FAILED => Some(GoudError::InitializationFailed(String::new())),
46
47            // Resource errors (100-199)
48            ERR_RESOURCE_NOT_FOUND => Some(GoudError::ResourceNotFound(String::new())),
49            ERR_RESOURCE_LOAD_FAILED => Some(GoudError::ResourceLoadFailed(String::new())),
50            ERR_RESOURCE_INVALID_FORMAT => Some(GoudError::ResourceInvalidFormat(String::new())),
51            ERR_RESOURCE_ALREADY_EXISTS => Some(GoudError::ResourceAlreadyExists(String::new())),
52            ERR_INVALID_HANDLE => Some(GoudError::InvalidHandle),
53            ERR_HANDLE_EXPIRED => Some(GoudError::HandleExpired),
54            ERR_HANDLE_TYPE_MISMATCH => Some(GoudError::HandleTypeMismatch),
55
56            // Graphics errors (200-299)
57            ERR_SHADER_COMPILATION_FAILED => {
58                Some(GoudError::ShaderCompilationFailed(String::new()))
59            }
60            ERR_SHADER_LINK_FAILED => Some(GoudError::ShaderLinkFailed(String::new())),
61            ERR_TEXTURE_CREATION_FAILED => Some(GoudError::TextureCreationFailed(String::new())),
62            ERR_BUFFER_CREATION_FAILED => Some(GoudError::BufferCreationFailed(String::new())),
63            ERR_RENDER_TARGET_FAILED => Some(GoudError::RenderTargetFailed(String::new())),
64            ERR_BACKEND_NOT_SUPPORTED => Some(GoudError::BackendNotSupported(String::new())),
65            ERR_DRAW_CALL_FAILED => Some(GoudError::DrawCallFailed(String::new())),
66
67            // Entity errors (300-399)
68            ERR_ENTITY_NOT_FOUND => Some(GoudError::EntityNotFound),
69            ERR_ENTITY_ALREADY_EXISTS => Some(GoudError::EntityAlreadyExists),
70            ERR_COMPONENT_NOT_FOUND => Some(GoudError::ComponentNotFound),
71            ERR_COMPONENT_ALREADY_EXISTS => Some(GoudError::ComponentAlreadyExists),
72            ERR_QUERY_FAILED => Some(GoudError::QueryFailed(String::new())),
73
74            // Input errors (400-499)
75            ERR_INPUT_DEVICE_NOT_FOUND => Some(GoudError::InputDeviceNotFound),
76            ERR_INVALID_INPUT_ACTION => Some(GoudError::InvalidInputAction(String::new())),
77
78            // System errors (500-599)
79            ERR_WINDOW_CREATION_FAILED => Some(GoudError::WindowCreationFailed(String::new())),
80            ERR_AUDIO_INIT_FAILED => Some(GoudError::AudioInitFailed(String::new())),
81            ERR_PHYSICS_INIT_FAILED => Some(GoudError::PhysicsInitFailed(String::new())),
82            ERR_PLATFORM_ERROR => Some(GoudError::PlatformError(String::new())),
83
84            // Provider errors (600-699)
85            ERR_PROVIDER_OPERATION_FAILED => Some(GoudError::ProviderError {
86                subsystem: "unknown",
87                message: String::new(),
88            }),
89
90            // Internal errors (900-999)
91            ERR_INTERNAL_ERROR => Some(GoudError::InternalError(String::new())),
92            ERR_NOT_IMPLEMENTED => Some(GoudError::NotImplemented(String::new())),
93            ERR_INVALID_STATE => Some(GoudError::InvalidState(String::new())),
94
95            _ => None,
96        }
97    }
98}