use std::{
error::Error,
ffi::NulError,
fmt::{Display, Formatter},
};
#[derive(Debug)]
pub enum FrameworkError {
ShaderCompilationFailed {
shader_name: String,
error_message: String,
},
ShaderLinkingFailed {
shader_name: String,
error_message: String,
},
FaultyShaderSource,
UnableToFindShaderUniform(String),
UnableToFindShaderUniformBlock(String),
InvalidTextureData {
expected_data_size: usize,
actual_data_size: usize,
},
EmptyTextureData,
InvalidElementRange {
start: usize,
end: usize,
total: usize,
},
InvalidAttributeDescriptor,
InvalidFrameBuffer,
FailedToConstructFBO,
Custom(String),
GraphicsServerUnavailable,
}
impl std::error::Error for FrameworkError {}
impl Display for FrameworkError {
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
match self {
FrameworkError::ShaderCompilationFailed {
shader_name,
error_message,
} => {
write!(
f,
"Compilation of \"{shader_name}\" shader has failed: {error_message}",
)
}
FrameworkError::ShaderLinkingFailed {
shader_name,
error_message,
} => {
write!(
f,
"Linking shader \"{shader_name}\" failed: {error_message}",
)
}
FrameworkError::FaultyShaderSource => {
write!(f, "Shader source contains invalid characters")
}
FrameworkError::UnableToFindShaderUniform(v) => {
write!(f, "There is no such shader uniform: {v}")
}
FrameworkError::UnableToFindShaderUniformBlock(v) => {
write!(f, "There is no such shader uniform block: {v}")
}
FrameworkError::InvalidTextureData {
expected_data_size,
actual_data_size,
} => {
write!(
f,
"Texture has invalid data (insufficent size): \
expected {expected_data_size}, actual: {actual_data_size}",
)
}
FrameworkError::EmptyTextureData => {
write!(
f,
"None variant was passed as texture data, but engine does not support it."
)
}
FrameworkError::InvalidElementRange { start, end, total } => {
write!(
f,
"Tried to draw element from GeometryBuffer that does not have enough \
elements: start: {start}, end: {end}, total: {total}",
)
}
FrameworkError::InvalidAttributeDescriptor => {
write!(
f,
"An attribute descriptor tried to define an attribute that \
does not exist in vertex or doesn't match size."
)
}
FrameworkError::InvalidFrameBuffer => {
write!(f, "Framebuffer is invalid")
}
FrameworkError::FailedToConstructFBO => {
write!(f, "OpenGL failed to construct framebuffer.")
}
FrameworkError::Custom(v) => {
write!(f, "Custom error: {v}")
}
FrameworkError::GraphicsServerUnavailable => {
write!(f, "Graphics server disconnected.")
}
}
}
}
impl From<NulError> for FrameworkError {
fn from(_: NulError) -> Self {
Self::FaultyShaderSource
}
}
impl From<String> for FrameworkError {
fn from(v: String) -> Self {
Self::Custom(v)
}
}
impl From<Box<dyn Error>> for FrameworkError {
fn from(e: Box<dyn Error>) -> Self {
Self::Custom(format!("{e:?}"))
}
}