Skip to main content

deboa_extras/http/serde/
msgpack.rs

1use deboa::{
2    client::serde::{RequestBody, ResponseBody},
3    errors::{ContentError, DeboaError},
4    request::DeboaRequest,
5    Result,
6};
7use http::header;
8use mime_typed::Msgpack;
9use serde::{Deserialize, Serialize};
10
11pub struct MsgPackBody;
12
13impl RequestBody for MsgPackBody {
14    fn register_content_type(&self, request: &mut DeboaRequest) {
15        request.add_header(
16            header::CONTENT_TYPE,
17            Msgpack
18                .to_string()
19                .as_str(),
20        );
21        request.add_header(
22            header::ACCEPT,
23            Msgpack
24                .to_string()
25                .as_str(),
26        );
27    }
28
29    fn serialize<T: Serialize>(&self, data: T) -> Result<Vec<u8>> {
30        let result = rmp_serde::to_vec(&data);
31        if let Err(error) = result {
32            return Err(DeboaError::Content(ContentError::Serialization {
33                message: error.to_string(),
34            }));
35        }
36
37        Ok(result.unwrap())
38    }
39}
40
41impl ResponseBody for MsgPackBody {
42    fn deserialize<T: for<'a> Deserialize<'a>>(&self, body: Vec<u8>) -> Result<T> {
43        let binding = body;
44        let body = binding.as_ref();
45
46        let json = rmp_serde::from_slice(body);
47
48        match json {
49            Ok(deserialized_body) => Ok(deserialized_body),
50            Err(err) => {
51                Err(DeboaError::Content(ContentError::Deserialization { message: err.to_string() }))
52            }
53        }
54    }
55}