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