Skip to main content

stationxml_rs/
error.rs

1//! Error types for stationxml-rs.
2
3use thiserror::Error;
4
5/// All errors that can occur when reading/writing station metadata.
6#[derive(Debug, Error)]
7pub enum StationXmlError {
8    /// Failed to deserialize XML (invalid structure, missing elements, etc.)
9    #[error("XML parsing error: {0}")]
10    XmlParse(#[from] quick_xml::DeError),
11
12    /// Failed to serialize to XML
13    #[error("XML serialization error: {0}")]
14    XmlSerialize(#[from] quick_xml::SeError),
15
16    /// Failed to parse JSON (sensor library)
17    #[error("JSON error: {0}")]
18    Json(#[from] serde_json::Error),
19
20    /// File I/O error
21    #[error("IO error: {0}")]
22    Io(#[from] std::io::Error),
23
24    /// Could not detect XML format from root element
25    #[error("unknown format: could not detect XML format from root element")]
26    UnknownFormat,
27
28    /// Data is present but invalid (bad datetime, out-of-range value, etc.)
29    #[error("invalid data: {0}")]
30    InvalidData(String),
31
32    /// A required field is missing from the input
33    #[error("missing required field: {0}")]
34    MissingField(String),
35}
36
37/// Convenience alias used throughout the crate.
38pub 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}