deboa_extras/http/serde/
xml.rs1use std::io::Cursor;
2
3use deboa::client::serde::{RequestBody, ResponseBody};
4use deboa::{
5 errors::{ContentError, DeboaError},
6 Result,
7};
8use mime_typed::{MimeStrExt, TextXml};
9use serde::{Deserialize, Serialize};
10pub struct XmlBody;
11
12impl RequestBody for XmlBody {
13 fn mime_type(&self) -> &str {
14 TextXml::MIME_STR
15 }
16
17 fn serialize<T: Serialize>(&self, data: T) -> Result<Vec<u8>> {
18 let mut ser_xml_buf = Vec::new();
19
20 let result = serde_xml_rust::to_writer(&mut ser_xml_buf, &data);
21
22 if let Err(error) = result {
23 return Err(DeboaError::Content(ContentError::Serialization {
24 message: error.to_string(),
25 }));
26 }
27
28 Ok(ser_xml_buf)
29 }
30}
31
32impl ResponseBody for XmlBody {
33 fn deserialize<T: for<'a> Deserialize<'a>>(&self, body: Vec<u8>) -> Result<T> {
34 let xml = serde_xml_rust::from_reader(Cursor::new(body));
35
36 match xml {
37 Ok(deserialized_body) => Ok(deserialized_body),
38 Err(err) => {
39 Err(DeboaError::Content(ContentError::Deserialization { message: err.to_string() }))
40 }
41 }
42 }
43}