camel_processor/data_format/
xml.rs1use 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}