calamine/
errors.rs

1// SPDX-License-Identifier: MIT
2//
3// Copyright 2016-2025, Johann Tuffe.
4
5//! A module to provide a convenient wrapper around all error types
6
7/// A struct to handle any error and a message
8#[derive(Debug)]
9pub enum Error {
10    /// IO error
11    Io(std::io::Error),
12
13    /// Ods specific error
14    Ods(crate::ods::OdsError),
15    /// xls specific error
16    Xls(crate::xls::XlsError),
17    /// xlsb specific error
18    Xlsb(crate::xlsb::XlsbError),
19    /// xlsx specific error
20    Xlsx(crate::xlsx::XlsxError),
21    /// vba specific error
22    Vba(crate::vba::VbaError),
23    /// cfb specific error
24    De(crate::de::DeError),
25
26    /// General error message
27    Msg(&'static str),
28}
29
30from_err!(std::io::Error, Error, Io);
31from_err!(crate::ods::OdsError, Error, Ods);
32from_err!(crate::xls::XlsError, Error, Xls);
33from_err!(crate::xlsb::XlsbError, Error, Xlsb);
34from_err!(crate::xlsx::XlsxError, Error, Xlsx);
35from_err!(crate::vba::VbaError, Error, Vba);
36from_err!(crate::de::DeError, Error, De);
37from_err!(&'static str, Error, Msg);
38
39impl std::fmt::Display for Error {
40    fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
41        match self {
42            Error::Io(e) => write!(f, "I/O error: {e}"),
43            Error::Ods(e) => write!(f, "Ods error: {e}"),
44            Error::Xls(e) => write!(f, "Xls error: {e}"),
45            Error::Xlsx(e) => write!(f, "Xlsx error: {e}"),
46            Error::Xlsb(e) => write!(f, "Xlsb error: {e}"),
47            Error::Vba(e) => write!(f, "Vba error: {e}"),
48            Error::De(e) => write!(f, "Deserializer error: {e}"),
49            Error::Msg(msg) => write!(f, "{msg}"),
50        }
51    }
52}
53
54impl std::error::Error for Error {
55    fn source(&self) -> Option<&(dyn std::error::Error + 'static)> {
56        match self {
57            Error::Io(e) => Some(e),
58            Error::Ods(e) => Some(e),
59            Error::Xls(e) => Some(e),
60            Error::Xlsb(e) => Some(e),
61            Error::Xlsx(e) => Some(e),
62            Error::Vba(e) => Some(e),
63            Error::De(e) => Some(e),
64            Error::Msg(_) => None,
65        }
66    }
67}