Skip to main content

camel_processor/data_format/
xml.rs

1use camel_api::body::Body;
2use camel_api::body_converter::{BodyType, convert};
3use camel_api::data_format::DataFormat;
4use camel_api::error::CamelError;
5
6pub struct XmlDataFormat;
7
8impl DataFormat for XmlDataFormat {
9    fn name(&self) -> &str {
10        "xml"
11    }
12
13    fn marshal(&self, body: Body) -> Result<Body, CamelError> {
14        match body {
15            Body::Xml(_) => convert(body, BodyType::Text),
16            Body::Text(_) => Ok(body),
17            Body::Stream(_) => Err(CamelError::TypeConversionFailed(
18                "cannot marshal Body::Stream — materialize with into_bytes() first".to_string(),
19            )),
20            Body::Empty | Body::Bytes(_) | Body::Json(_) => Err(CamelError::TypeConversionFailed(
21                "XmlDataFormat::marshal only supports Body::Xml and Body::Text".to_string(),
22            )),
23        }
24    }
25
26    fn unmarshal(&self, body: Body) -> Result<Body, CamelError> {
27        match body {
28            Body::Xml(_) => Ok(body),
29            Body::Text(_) | Body::Bytes(_) => convert(body, BodyType::Xml),
30            Body::Stream(_) => Err(CamelError::TypeConversionFailed(
31                "cannot unmarshal Body::Stream — materialize with into_bytes() first".to_string(),
32            )),
33            Body::Empty | Body::Json(_) => Err(CamelError::TypeConversionFailed(
34                "XmlDataFormat::unmarshal only supports Body::Xml, Body::Text, and Body::Bytes"
35                    .to_string(),
36            )),
37        }
38    }
39}
40
41#[cfg(test)]
42mod tests {
43    use super::*;
44    use bytes::Bytes;
45
46    #[test]
47    fn test_name() {
48        assert_eq!(XmlDataFormat.name(), "xml");
49    }
50
51    #[test]
52    fn test_unmarshal_text_to_xml() {
53        let body = Body::Text("<root><child>value</child></root>".to_string());
54        let result = XmlDataFormat.unmarshal(body).unwrap();
55        assert!(matches!(result, Body::Xml(_)));
56    }
57
58    #[test]
59    fn test_unmarshal_bytes_to_xml() {
60        let body = Body::Bytes(Bytes::from_static(b"<root/>"));
61        let result = XmlDataFormat.unmarshal(body).unwrap();
62        assert!(matches!(result, Body::Xml(_)));
63    }
64
65    #[test]
66    fn test_unmarshal_invalid_xml() {
67        let body = Body::Text("not xml".to_string());
68        let result = XmlDataFormat.unmarshal(body);
69        assert!(matches!(result, Err(CamelError::TypeConversionFailed(_))));
70    }
71
72    #[test]
73    fn test_unmarshal_xml_noop() {
74        let body = Body::Xml("<root/>".to_string());
75        let result = XmlDataFormat.unmarshal(body).unwrap();
76        assert!(matches!(result, Body::Xml(_)));
77    }
78
79    #[test]
80    fn test_unmarshal_unsupported_variant() {
81        let body = Body::Empty;
82        let result = XmlDataFormat.unmarshal(body);
83        assert!(matches!(result, Err(CamelError::TypeConversionFailed(_))));
84    }
85
86    #[test]
87    fn test_marshal_xml_to_text() {
88        let body = Body::Xml("<root>content</root>".to_string());
89        let result = XmlDataFormat.marshal(body).unwrap();
90        assert_eq!(result, Body::Text("<root>content</root>".to_string()));
91    }
92
93    #[test]
94    fn test_marshal_text_noop() {
95        let body = Body::Text("already text".to_string());
96        let result = XmlDataFormat.marshal(body).unwrap();
97        assert_eq!(result, Body::Text("already text".to_string()));
98    }
99
100    #[test]
101    fn test_marshal_unsupported_variant() {
102        let body = Body::Empty;
103        let result = XmlDataFormat.marshal(body);
104        assert!(matches!(result, Err(CamelError::TypeConversionFailed(_))));
105    }
106}