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