1use thiserror::Error;
4
5#[derive(Debug, Error)]
7pub enum StationXmlError {
8 #[error("XML parsing error: {0}")]
10 XmlParse(#[from] quick_xml::DeError),
11
12 #[error("XML serialization error: {0}")]
14 XmlSerialize(#[from] quick_xml::SeError),
15
16 #[error("JSON error: {0}")]
18 Json(#[from] serde_json::Error),
19
20 #[error("IO error: {0}")]
22 Io(#[from] std::io::Error),
23
24 #[error("unknown format: could not detect XML format from root element")]
26 UnknownFormat,
27
28 #[error("invalid data: {0}")]
30 InvalidData(String),
31
32 #[error("missing required field: {0}")]
34 MissingField(String),
35}
36
37pub type Result<T> = std::result::Result<T, StationXmlError>;
39
40#[cfg(test)]
41mod tests {
42 use super::*;
43
44 #[test]
45 fn error_display_unknown_format() {
46 let err = StationXmlError::UnknownFormat;
47 assert!(err.to_string().contains("unknown format"));
48 }
49
50 #[test]
51 fn error_display_invalid_data() {
52 let err = StationXmlError::InvalidData("bad datetime value".into());
53 assert!(err.to_string().contains("bad datetime value"));
54 }
55
56 #[test]
57 fn error_display_missing_field() {
58 let err = StationXmlError::MissingField("Latitude".into());
59 assert!(err.to_string().contains("Latitude"));
60 }
61
62 #[test]
63 fn error_from_io() {
64 let io_err = std::io::Error::new(std::io::ErrorKind::NotFound, "file not found");
65 let err: StationXmlError = io_err.into();
66 assert!(err.to_string().contains("file not found"));
67 }
68}