use powerio_core::DiagnosticInfo;
use thiserror::Error as ThisError;
use crate::diagnostics::codes;
#[derive(Debug, ThisError)]
#[non_exhaustive]
pub enum Error {
#[error(transparent)]
Transmission(#[from] powerio_tx::Error),
#[error(transparent)]
Io(#[from] std::io::Error),
}
impl Error {
#[must_use]
pub fn code(&self) -> &'static DiagnosticInfo {
match self {
Error::Transmission(inner) => inner.code(),
Error::Io(_) => &codes::READ_INSTANCE_IO_FAILED,
}
}
#[must_use]
pub fn category(&self) -> powerio_tx::ErrorCategory {
use powerio_tx::ErrorCategory as C;
match self {
Error::Transmission(inner) => inner.category(),
Error::Io(_) => C::Io,
}
}
}
pub type Result<T> = std::result::Result<T, Error>;
#[cfg(test)]
mod tests {
use super::*;
use powerio_tx::ErrorCategory::Parse;
#[test]
fn every_error_code_publishes_the_category_the_variant_reports() {
let every: Vec<Error> = vec![
powerio_tx::Error::MissingField("gen").into(),
std::io::Error::from(std::io::ErrorKind::NotFound).into(),
];
for error in &every {
assert_eq!(
error.code().category,
Some(error.category()),
"{}",
error.code().code
);
}
}
#[test]
fn a_wrapped_hub_error_keeps_its_own_category_and_message() {
let wrapped: Error = powerio_tx::Error::MissingField("gen").into();
assert_eq!(wrapped.category(), Parse);
assert_eq!(
wrapped.to_string(),
powerio_tx::Error::MissingField("gen").to_string()
);
}
}