Skip to main content

easyofd_core/
error.rs

1//! Error types for easyofd.
2
3use thiserror::Error;
4
5/// The result type alias for easyofd operations.
6pub type OfdResult<T> = std::result::Result<T, OfdError>;
7
8/// Errors that can occur during OFD operations.
9#[derive(Debug, Error)]
10pub enum OfdError {
11    /// I/O error.
12    #[error("I/O error: {0}")]
13    Io(#[from] std::io::Error),
14
15    /// XML serialization/deserialization error.
16    #[error("XML error: {0}")]
17    Xml(String),
18
19    /// ZIP archive error.
20    #[error("ZIP error: {0}")]
21    Zip(String),
22
23    /// Invalid OFD document structure.
24    #[error("invalid OFD document: {0}")]
25    InvalidDocument(String),
26
27    /// Invalid page content.
28    #[error("invalid page content: {0}")]
29    InvalidPage(String),
30
31    /// Conversion error.
32    #[error("conversion error: {0}")]
33    Conversion(String),
34
35    /// Model error (from `OfdModel` trait).
36    #[error("model error: {0}")]
37    Model(String),
38}
39
40#[cfg(test)]
41mod tests {
42    use super::*;
43
44    #[test]
45    fn test_error_display_io() {
46        let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file gone");
47        let err = OfdError::Io(io_err);
48        assert!(format!("{err}").contains("I/O error"));
49    }
50
51    #[test]
52    fn test_error_display_xml() {
53        let err = OfdError::Xml("bad tag".into());
54        assert_eq!(format!("{err}"), "XML error: bad tag");
55    }
56
57    #[test]
58    fn test_error_display_zip() {
59        let err = OfdError::Zip("corrupt".into());
60        assert_eq!(format!("{err}"), "ZIP error: corrupt");
61    }
62
63    #[test]
64    fn test_error_display_invalid_document() {
65        let err = OfdError::InvalidDocument("missing OFD.xml".into());
66        assert_eq!(format!("{err}"), "invalid OFD document: missing OFD.xml");
67    }
68
69    #[test]
70    fn test_error_display_invalid_page() {
71        let err = OfdError::InvalidPage("no content".into());
72        assert_eq!(format!("{err}"), "invalid page content: no content");
73    }
74
75    #[test]
76    fn test_error_display_conversion() {
77        let err = OfdError::Conversion("type mismatch".into());
78        assert_eq!(format!("{err}"), "conversion error: type mismatch");
79    }
80
81    #[test]
82    fn test_error_display_model() {
83        let err = OfdError::Model("field missing".into());
84        assert_eq!(format!("{err}"), "model error: field missing");
85    }
86
87    #[test]
88    fn test_error_from_io() {
89        let io_err = std::io::Error::other("oops");
90        let err: OfdError = io_err.into();
91        assert!(matches!(err, OfdError::Io(_)));
92    }
93
94    #[test]
95    fn test_error_debug() {
96        let err = OfdError::Xml("x".into());
97        let dbg = format!("{err:?}");
98        assert!(dbg.contains("Xml"));
99    }
100
101    #[test]
102    fn test_result_alias() {
103        let ok: OfdResult<i32> = Ok(42);
104        let err: OfdResult<i32> = Err(OfdError::Model("fail".into()));
105        assert!(ok.is_ok());
106        assert!(matches!(ok, Ok(42)));
107        assert!(err.is_err());
108    }
109}