use std::{
error::Error as StdErrTrait,
fmt::{Display, Formatter, Result as FmtResult},
io::Error as IoError,
};
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Debug)]
pub enum Error {
EmptyPath,
Other(String),
CargoTomlError(cargo_toml::Error),
IoError(IoError),
BadModuleName,
}
impl Error {
pub fn other<T>(e: impl ToString) -> Result<T> {
Err(Self::Other(e.to_string()))
}
pub fn bad_module_name<T>() -> Result<T> {
Err(Self::BadModuleName)
}
}
impl Display for Error {
fn fmt(&self, f: &mut Formatter<'_>) -> FmtResult {
match self {
Error::EmptyPath => write!(f, "one or more modules have empty names"),
Error::Other(oe) => write!(f, "{}", oe),
Error::CargoTomlError(cargo) => write!(f, "failed to read `Cargo.toml`: {}", cargo),
Error::IoError(ioe) => write!(f, "I/O error: {ioe}"),
Error::BadModuleName => write!(f, "bad module name"),
}
}
}
impl StdErrTrait for Error {}
impl From<cargo_toml::Error> for Error {
fn from(e: cargo_toml::Error) -> Self {
Self::CargoTomlError(e)
}
}
impl From<IoError> for Error {
fn from(e: IoError) -> Self {
Self::IoError(e)
}
}