use std::fmt;
#[derive(Debug)]
pub enum Error {
Parse {
map: String,
offset: usize,
expected: Vec<String>,
},
MapNotFound(String),
DependencyCycle(Vec<String>),
Unsupported(String),
MapLogic(String),
Model(String),
Io(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Parse { map, offset, expected } => write!(
f,
"parse failed in {map} at offset {offset} (expected one of: {})",
expected.join(", ")
),
Error::MapNotFound(name) => write!(f, "couldn't locate map {name:?}"),
Error::DependencyCycle(chain) => {
write!(f, "dependency cycle: {}", chain.join(" -> "))
}
Error::Unsupported(what) => write!(f, "unsupported: {what}"),
Error::MapLogic(what) => write!(f, "map logic error: {what}"),
Error::Model(what) => write!(f, "model error: {what}"),
Error::Io(what) => write!(f, "io error: {what}"),
}
}
}
impl std::error::Error for Error {}
impl From<std::io::Error> for Error {
fn from(err: std::io::Error) -> Self {
Error::Io(err.to_string())
}
}
pub type Result<T> = std::result::Result<T, Error>;