xsd_schema/document/
error.rs1use thiserror::Error;
2
3#[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 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}