Skip to main content

deboa_extras/http/serde/
msgpack.rs

1use deboa::{
2    client::serde::{RequestBody, ResponseBody},
3    errors::{ContentError, DeboaError},
4    Result,
5};
6use mime_typed::{ApplicationMsgpack, MimeStrExt};
7use serde::{Deserialize, Serialize};
8
9pub struct MsgPackBody;
10
11impl RequestBody for MsgPackBody {
12    fn mime_type(&self) -> &str {
13        ApplicationMsgpack::MIME_STR
14    }
15
16    fn serialize<T: Serialize>(&self, data: T) -> Result<Vec<u8>> {
17        let result = rmp_serde::to_vec(&data);
18        if let Err(error) = result {
19            return Err(DeboaError::Content(ContentError::Serialization {
20                message: error.to_string(),
21            }));
22        }
23
24        Ok(result.unwrap())
25    }
26}
27
28impl ResponseBody for MsgPackBody {
29    fn deserialize<T: for<'a> Deserialize<'a>>(&self, body: Vec<u8>) -> Result<T> {
30        let binding = body;
31        let body = binding.as_ref();
32
33        let json = rmp_serde::from_slice(body);
34
35        match json {
36            Ok(deserialized_body) => Ok(deserialized_body),
37            Err(err) => {
38                Err(DeboaError::Content(ContentError::Deserialization { message: err.to_string() }))
39            }
40        }
41    }
42}