flow_rs_renderer/
error.rs1use thiserror::Error;
4
5#[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 pub fn initialization_failed(message: impl Into<String>) -> Self {
54 Self::InitializationFailed {
55 message: message.into(),
56 }
57 }
58
59 pub fn context_creation_failed(message: impl Into<String>) -> Self {
61 Self::ContextCreationFailed {
62 message: message.into(),
63 }
64 }
65
66 pub fn rendering_failed(message: impl Into<String>) -> Self {
68 Self::RenderingFailed {
69 message: message.into(),
70 }
71 }
72
73 pub fn unsupported_feature(feature: impl Into<String>) -> Self {
75 Self::UnsupportedFeature {
76 feature: feature.into(),
77 }
78 }
79
80 pub fn resource_creation_failed(resource: impl Into<String>) -> Self {
82 Self::ResourceCreationFailed {
83 resource: resource.into(),
84 }
85 }
86
87 pub fn invalid_state(message: impl Into<String>) -> Self {
89 Self::InvalidState {
90 message: message.into(),
91 }
92 }
93
94 pub fn shader_compilation_failed(message: impl Into<String>) -> Self {
96 Self::ShaderCompilationFailed {
97 message: message.into(),
98 }
99 }
100
101 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 pub fn is_performance_warning(&self) -> bool {
115 matches!(self, Self::PerformanceWarning { .. })
116 }
117}
118
119pub 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}