Skip to main content

xsd_schema/document/
error.rs

1use thiserror::Error;
2
3/// Errors that can occur during `BufferDocument` construction or navigation.
4#[derive(Debug, Error)]
5pub enum BufferDocumentError {
6    #[error("XML parsing error: {0}")]
7    Parse(#[from] quick_xml::Error),
8
9    #[error("Invalid UTF-8 in XML: {0}")]
10    Utf8(#[from] std::str::Utf8Error),
11
12    #[error("Namespace resolution error: prefix '{0}' not bound")]
13    UnboundPrefix(String),
14
15    #[error("Duplicate ID value: '{0}'")]
16    DuplicateId(String),
17
18    #[error("Node allocation overflow (exceeds u32::MAX - 1 nodes)")]
19    Overflow,
20
21    #[error("end_element called without matching start_element")]
22    UnmatchedEndElement,
23
24    #[error("Internal error: {0}")]
25    InternalError(String),
26}
27
28#[cfg(test)]
29mod tests {
30    use super::*;
31
32    #[test]
33    fn display_unbound_prefix() {
34        let err = BufferDocumentError::UnboundPrefix("ns1".into());
35        assert_eq!(
36            err.to_string(),
37            "Namespace resolution error: prefix 'ns1' not bound"
38        );
39    }
40
41    #[test]
42    fn display_duplicate_id() {
43        let err = BufferDocumentError::DuplicateId("myId".into());
44        assert_eq!(err.to_string(), "Duplicate ID value: 'myId'");
45    }
46
47    #[test]
48    fn display_overflow() {
49        let err = BufferDocumentError::Overflow;
50        assert_eq!(
51            err.to_string(),
52            "Node allocation overflow (exceeds u32::MAX - 1 nodes)"
53        );
54    }
55
56    #[test]
57    fn from_quick_xml_error() {
58        let qx_err = quick_xml::Error::TextNotFound;
59        let err: BufferDocumentError = qx_err.into();
60        assert!(matches!(err, BufferDocumentError::Parse(_)));
61        assert!(err.to_string().contains("XML parsing error"));
62    }
63
64    #[test]
65    fn from_utf8_error() {
66        // Create a real Utf8Error by decoding invalid bytes at runtime
67        let bad: &[u8] = &[0xFF, 0xFE];
68        #[allow(invalid_from_utf8)]
69        let utf8_err = std::str::from_utf8(bad).unwrap_err();
70        let err: BufferDocumentError = utf8_err.into();
71        assert!(matches!(err, BufferDocumentError::Utf8(_)));
72        assert!(err.to_string().contains("Invalid UTF-8"));
73    }
74}