use std::fmt;
#[derive(Debug)]
#[non_exhaustive]
pub enum Error {
Io(std::io::Error),
TypeScript(String),
Scss(String),
Minify(String),
Dts(String),
Vendor(String),
ImportMap(String),
Template(String),
I18n(String),
Icons(String),
Build(String),
Compose(String),
Bundle(String),
}
impl fmt::Display for Error {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
match self {
Error::Io(e) => write!(f, "{e}"),
Error::TypeScript(m) => write!(f, "typescript: {m}"),
Error::Scss(m) => write!(f, "scss: {m}"),
Error::Minify(m) => write!(f, "minify: {m}"),
Error::Dts(m) => write!(f, "dts: {m}"),
Error::Vendor(m) => write!(f, "vendor: {m}"),
Error::ImportMap(m) => write!(f, "importmap: {m}"),
Error::Template(m) => write!(f, "template: {m}"),
Error::I18n(m) => write!(f, "i18n: {m}"),
Error::Icons(m) => write!(f, "icons: {m}"),
Error::Build(m) => write!(f, "{m}"),
Error::Compose(m) => write!(f, "compose: {m}"),
Error::Bundle(m) => write!(f, "bundle: {m}"),
}
}
}
impl std::error::Error for Error {
fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
match self {
Error::Io(e) => Some(e),
_ => None,
}
}
}
impl From<std::io::Error> for Error {
fn from(e: std::io::Error) -> Self {
Error::Io(e)
}
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
use std::error::Error as _;
#[test]
fn display_prefixes_message_by_kind() {
assert_eq!(
Error::TypeScript("bad token".into()).to_string(),
"typescript: bad token"
);
assert_eq!(Error::Scss("oops".into()).to_string(), "scss: oops");
assert_eq!(Error::Compose("drift".into()).to_string(), "compose: drift");
assert_eq!(
Error::Build("unresolved import".into()).to_string(),
"unresolved import"
);
}
#[test]
fn io_preserves_underlying_error_as_source() {
let io = std::io::Error::new(std::io::ErrorKind::NotFound, "no such file");
let err: Error = io.into(); assert!(matches!(err, Error::Io(_)));
assert_eq!(err.to_string(), "no such file");
assert!(err.source().is_some());
}
}