fcplug/
serde.rs

1use std::fmt::Debug;
2
3use serde::{Deserialize, Serialize};
4
5use crate::{
6    ABIResult, FromMessage, IntoMessage, ResultMsg, TryFromBytes, TryIntoBytes, RC_DECODE,
7};
8
9#[derive(Debug)]
10pub struct JsonMessage<T: for<'a> Deserialize<'a> + Serialize + Debug>(pub T);
11
12impl<T> FromMessage<JsonMessage<T>> for T
13where
14    T: for<'a> Deserialize<'a> + Serialize + Debug,
15{
16    #[inline]
17    fn from_message(value: JsonMessage<T>) -> Self {
18        value.0
19    }
20}
21
22impl<T> IntoMessage<JsonMessage<T>> for T
23where
24    T: for<'a> Deserialize<'a> + Serialize + Debug,
25{
26    #[inline]
27    fn into_message(self) -> JsonMessage<T> {
28        JsonMessage(self)
29    }
30}
31
32impl<T> TryFromBytes<'_> for JsonMessage<T>
33where
34    T: for<'a> Deserialize<'a> + Serialize + Debug,
35{
36    #[inline]
37    fn try_from_bytes(buf: &mut [u8]) -> ABIResult<Self>
38    where
39        Self: Sized,
40    {
41        Ok(serde_json::from_slice::<T>(buf as &[u8])
42            .map(JsonMessage)
43            .map_err(decode_map_err)?)
44    }
45}
46
47impl<T> TryIntoBytes for JsonMessage<T>
48where
49    T: for<'a> Deserialize<'a> + Serialize + Debug,
50{
51    #[inline]
52    fn try_into_bytes(self) -> ABIResult<Vec<u8>> {
53        Ok(serde_json::to_vec(&self.0).map_err(encode_map_err)?)
54    }
55}
56
57#[inline]
58fn decode_map_err(e: serde_json::Error) -> ResultMsg {
59    ResultMsg {
60        code: RC_DECODE,
61        msg: e.to_string(),
62    }
63}
64
65#[inline]
66fn encode_map_err(e: serde_json::Error) -> ResultMsg {
67    ResultMsg {
68        code: RC_DECODE,
69        msg: e.to_string(),
70    }
71}