use std::io;
use thiserror::Error;
pub type Result<T> = std::result::Result<T, Error>;
#[derive(Error, Debug)]
#[non_exhaustive]
pub enum Error {
#[error("I/O error: {0}")]
Io(#[from] io::Error),
#[error("unsupported format: {0}")]
UnsupportedFormat(String),
#[error("parse error: {0}")]
ParseError(String),
#[error("sheet `{requested}` not found in {path}; available: {available}")]
SheetNotFound {
requested: String,
path: String,
available: String,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn io_errors_convert_via_from() {
let io_err = io::Error::new(io::ErrorKind::NotFound, "missing");
let err: Error = io_err.into();
assert!(matches!(err, Error::Io(_)));
}
#[test]
fn unsupported_format_renders_message() {
let err = Error::UnsupportedFormat(".xyz".into());
assert!(err.to_string().contains(".xyz"));
}
#[test]
fn sheet_not_found_renders_diagnostically() {
let err = Error::SheetNotFound {
requested: "Q5".into(),
path: "/tmp/x.xlsx".into(),
available: "Q1, Q2, Q3, Q4".into(),
};
let s = err.to_string();
assert!(s.contains("Q5"));
assert!(s.contains("Q1, Q2, Q3, Q4"));
}
}