use std::result;
use std::io::Error;
use std::num::{ParseIntError, ParseFloatError};
use std::convert::From;
pub type ObjResult<T> = result::Result<T, ObjError>;
#[derive(Debug)]
enum ObjError {
Io(Error),
ParseInt(ParseIntError),
ParseFloat(ParseFloatError),
Load(LoadError)
}
impl From<Error> for ObjError {
fn from(err: Error) -> Self {
ObjError::Io(err)
}
}
impl From<ParseIntError> for ObjError {
fn from(err: ParseIntError) -> Self {
ObjError::ParseInt(err)
}
}
impl From<ParseFloatError> for ObjError {
fn from(err: ParseFloatError) -> Self {
ObjError::ParseFloat(err)
}
}
impl From<LoadError> for ObjError {
fn from(err: LoadError) -> Self {
ObjError::Load(err)
}
}
#[derive(PartialEq, Eq, Clone, Debug)]
pub struct LoadError {
kind: LoadErrorKind,
desc: &'static str,
}
#[derive(Copy, PartialEq, Eq, Clone, Debug)]
pub enum LoadErrorKind {
UnexpectedStatement,
WrongNumberOfArguments,
WrongTypeOfArguments,
UntriangulatedModel,
InsufficientData,
}
impl LoadError {
pub fn new(kind: LoadErrorKind, desc: &'static str) -> Self {
LoadError { kind: kind, desc: desc }
}
}
macro_rules! error {
($kind:ident, $desc:expr) => {
return Err(
::std::convert::From::from(
$crate::error::LoadError::new(
$crate::error::LoadErrorKind::$kind, $desc
)
)
)
}
}