deboa_extras/http/serde/
xml.rs1use 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}