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    request::DeboaRequest,
7    Result,
8};
9use http::header;
10use mime_typed::Xml;
11use serde::{Deserialize, Serialize};
12pub struct XmlBody;
13
14impl RequestBody for XmlBody {
15    fn register_content_type(&self, request: &mut DeboaRequest) {
16        request.add_header(
17            header::CONTENT_TYPE,
18            Xml.to_string()
19                .as_str(),
20        );
21        request.add_header(
22            header::ACCEPT,
23            Xml.to_string()
24                .as_str(),
25        );
26    }
27
28    fn serialize<T: Serialize>(&self, data: T) -> Result<Vec<u8>> {
29        let mut ser_xml_buf = Vec::new();
30
31        let result = serde_xml_rust::to_writer(&mut ser_xml_buf, &data);
32
33        if let Err(error) = result {
34            return Err(DeboaError::Content(ContentError::Serialization {
35                message: error.to_string(),
36            }));
37        }
38
39        Ok(ser_xml_buf)
40    }
41}
42
43impl ResponseBody for XmlBody {
44    fn deserialize<T: for<'a> Deserialize<'a>>(&self, body: Vec<u8>) -> Result<T> {
45        let xml = serde_xml_rust::from_reader(Cursor::new(body));
46
47        match xml {
48            Ok(deserialized_body) => Ok(deserialized_body),
49            Err(err) => {
50                Err(DeboaError::Content(ContentError::Deserialization { message: err.to_string() }))
51            }
52        }
53    }
54}