Skip to main content

deboa_extras/http/serde/
xml.rs

1use 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}