1use thiserror::Error;
4
5pub type OfdResult<T> = std::result::Result<T, OfdError>;
7
8#[derive(Debug, Error)]
10pub enum OfdError {
11 #[error("I/O error: {0}")]
13 Io(#[from] std::io::Error),
14
15 #[error("XML error: {0}")]
17 Xml(String),
18
19 #[error("ZIP error: {0}")]
21 Zip(String),
22
23 #[error("invalid OFD document: {0}")]
25 InvalidDocument(String),
26
27 #[error("invalid page content: {0}")]
29 InvalidPage(String),
30
31 #[error("conversion error: {0}")]
33 Conversion(String),
34
35 #[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}