use std::io::Error as IOError; use dhall_syntax::ParseError; use crate::phase::binary::DecodeError; use crate::phase::resolve::ImportError; use crate::phase::typecheck::TypeError; pub type Result = std::result::Result; #[derive(Debug)] #[non_exhaustive] pub enum Error { IO(IOError), Parse(ParseError), Decode(DecodeError), Resolve(ImportError), Typecheck(TypeError), Deserialize(String), } impl std::fmt::Display for Error { fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result { match self { Error::IO(err) => write!(f, "{}", err), Error::Parse(err) => write!(f, "{}", err), Error::Decode(err) => write!(f, "{:?}", err), Error::Resolve(err) => write!(f, "{:?}", err), Error::Typecheck(err) => write!(f, "{:?}", err), Error::Deserialize(err) => write!(f, "{}", err), } } } impl std::error::Error for Error {} impl From for Error { fn from(err: IOError) -> Error { Error::IO(err) } } impl From for Error { fn from(err: ParseError) -> Error { Error::Parse(err) } } impl From for Error { fn from(err: DecodeError) -> Error { Error::Decode(err) } } impl From for Error { fn from(err: ImportError) -> Error { Error::Resolve(err) } } impl From for Error { fn from(err: TypeError) -> Error { Error::Typecheck(err) } }