use std::error::Error;
use std::fmt;
#[derive(Debug)]
pub enum GameError {
IOError(std::io::Error),
ShaderProgramError(String),
GamepadError(String),
LyonError(String),
MixerNotCreated,
SoundError,
UnknownError(String),
ResourceNotFound(String, Vec<(std::path::PathBuf, GameError)>),
FilesystemError(String),
ResourceLoadError(String),
RenderError(String),
CustomError(String),
}
impl fmt::Display for GameError {
fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
write!(f, "GameError {:?}", self)
}
}
impl Error for GameError {
fn cause(&self) -> Option<&dyn Error> {
match *self {
GameError::IOError(ref e) => Some(e),
_ => None,
}
}
}
pub type GameResult<T = ()> = Result<T, GameError>;
impl From<std::io::Error> for GameError {
fn from(e: std::io::Error) -> GameError {
GameError::IOError(e)
}
}
#[cfg(feature = "mesh")]
impl From<lyon::lyon_tessellation::TessellationError> for GameError {
fn from(s: lyon::lyon_tessellation::TessellationError) -> GameError {
let errstr = format!(
"Error while tesselating shape (did you give it an infinity or NaN?): {:?}",
s
);
GameError::LyonError(errstr)
}
}
#[cfg(feature = "mesh")]
impl From<lyon::lyon_tessellation::geometry_builder::GeometryBuilderError> for GameError {
fn from(s: lyon::lyon_tessellation::geometry_builder::GeometryBuilderError) -> GameError {
let errstr = format!(
"Error while building geometry (did you give it too many vertices?): {:?}",
s
);
GameError::LyonError(errstr)
}
}
impl From<zip::result::ZipError> for GameError {
fn from(e: zip::result::ZipError) -> GameError {
let errstr = format!("Zip error: {}", e);
GameError::ResourceLoadError(errstr)
}
}
#[cfg(not(any(target_arch = "wasm32", target_os = "ios", target_os = "android",)))]
impl From<gilrs::Error> for GameError {
fn from(s: gilrs::Error) -> GameError {
let errstr = format!("Gamepad error: {}", s);
GameError::GamepadError(errstr)
}
}
impl From<miniquad::ShaderError> for GameError {
fn from(e: miniquad::ShaderError) -> GameError {
let errstr = format!("Shader creation error: {}", e);
GameError::ShaderProgramError(errstr)
}
}