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}