flow_rs_renderer/
error.rs

1//! Renderer error types
2
3use thiserror::Error;
4
5/// Renderer-specific errors
6#[derive(Debug, Error, Clone, PartialEq)]
7pub enum RendererError {
8    #[error("Initialization failed: {message}")]
9    InitializationFailed { message: String },
10
11    #[error("Context creation failed: {message}")]
12    ContextCreationFailed { message: String },
13
14    #[error("Rendering failed: {message}")]
15    RenderingFailed { message: String },
16
17    #[error("Unsupported feature: {feature}")]
18    UnsupportedFeature { feature: String },
19
20    #[error("Resource creation failed: {resource}")]
21    ResourceCreationFailed { resource: String },
22
23    #[error("Invalid state: {message}")]
24    InvalidState { message: String },
25
26    #[error("Canvas not found or invalid")]
27    InvalidCanvas,
28
29    #[error("WebGL context lost")]
30    ContextLost,
31
32    #[error("Shader compilation failed: {message}")]
33    ShaderCompilationFailed { message: String },
34
35    #[error("Buffer creation failed: {message}")]
36    BufferCreationFailed { message: String },
37
38    #[error("Texture creation failed: {message}")]
39    TextureCreationFailed { message: String },
40
41    #[error("Program linking failed: {message}")]
42    ProgramLinkingFailed { message: String },
43
44    #[error("Out of memory")]
45    OutOfMemory,
46
47    #[error("Performance warning: {message}")]
48    PerformanceWarning { message: String },
49}
50
51impl RendererError {
52    /// Create an initialization error
53    pub fn initialization_failed(message: impl Into<String>) -> Self {
54        Self::InitializationFailed {
55            message: message.into(),
56        }
57    }
58
59    /// Create a context creation error
60    pub fn context_creation_failed(message: impl Into<String>) -> Self {
61        Self::ContextCreationFailed {
62            message: message.into(),
63        }
64    }
65
66    /// Create a rendering error
67    pub fn rendering_failed(message: impl Into<String>) -> Self {
68        Self::RenderingFailed {
69            message: message.into(),
70        }
71    }
72
73    /// Create an unsupported feature error
74    pub fn unsupported_feature(feature: impl Into<String>) -> Self {
75        Self::UnsupportedFeature {
76            feature: feature.into(),
77        }
78    }
79
80    /// Create a resource creation error
81    pub fn resource_creation_failed(resource: impl Into<String>) -> Self {
82        Self::ResourceCreationFailed {
83            resource: resource.into(),
84        }
85    }
86
87    /// Create an invalid state error
88    pub fn invalid_state(message: impl Into<String>) -> Self {
89        Self::InvalidState {
90            message: message.into(),
91        }
92    }
93
94    /// Create a shader compilation error
95    pub fn shader_compilation_failed(message: impl Into<String>) -> Self {
96        Self::ShaderCompilationFailed {
97            message: message.into(),
98        }
99    }
100
101    /// Check if this is a recoverable error
102    pub fn is_recoverable(&self) -> bool {
103        match self {
104            Self::ContextLost => true,
105            Self::OutOfMemory => false,
106            Self::InvalidCanvas => false,
107            Self::InitializationFailed { .. } => false,
108            Self::ContextCreationFailed { .. } => false,
109            _ => true,
110        }
111    }
112
113    /// Check if this is a performance-related warning
114    pub fn is_performance_warning(&self) -> bool {
115        matches!(self, Self::PerformanceWarning { .. })
116    }
117}
118
119/// Result type for renderer operations
120pub type Result<T> = std::result::Result<T, RendererError>;
121
122#[cfg(test)]
123mod tests {
124    use super::*;
125
126    #[test]
127    fn test_error_creation() {
128        let error = RendererError::initialization_failed("Test message");
129        assert_eq!(error.to_string(), "Initialization failed: Test message");
130
131        let error = RendererError::unsupported_feature("WebGPU");
132        assert_eq!(error.to_string(), "Unsupported feature: WebGPU");
133    }
134
135    #[test]
136    fn test_error_properties() {
137        let recoverable = RendererError::ContextLost;
138        assert!(recoverable.is_recoverable());
139
140        let non_recoverable = RendererError::OutOfMemory;
141        assert!(!non_recoverable.is_recoverable());
142
143        let warning = RendererError::PerformanceWarning {
144            message: "Low FPS".to_string(),
145        };
146        assert!(warning.is_performance_warning());
147    }
148}