1#[cfg(feature = "json")]
2#[cfg_attr(docsrs, doc(cfg(feature = "json")))]
3pub mod json {
4 use crate::error::MessageError;
5 use crate::message::{Action, Message, PacketBytes};
6 use bytes::BytesRead;
7
8 use serde::{de::DeserializeOwned, Serialize};
9
10 pub fn encode<T, A, B>(value: T) -> Result<Message<A, B>, MessageError>
11 where
12 T: Serialize,
13 A: Action,
14 B: PacketBytes,
15 {
16 let mut msg = Message::new();
17 serde_json::to_writer(msg.body_mut(), &value)
18 .map_err(MessageError::Json)?;
19
20 Ok(msg)
21 }
22
23 pub fn decode<A, B, T>(msg: Message<A, B>) -> Result<T, MessageError>
24 where
25 A: Action,
26 B: PacketBytes,
27 T: DeserializeOwned,
28 {
29 serde_json::from_slice(msg.body().as_slice())
30 .map_err(MessageError::Json)
31 }
32}
33
34#[cfg(feature = "protobuf")]
35#[cfg_attr(docsrs, doc(cfg(feature = "protobuf")))]
36pub mod protobuf {
37 use crate::error::MessageError;
38 use crate::message::{Action, Message, PacketBytes};
39 use bytes::BytesRead;
40
41 use protopuffer::decode::DecodeMessage;
42 use protopuffer::encode::{EncodeMessage, MessageEncoder};
43
44 pub fn encode<T, A, B>(mut value: T) -> Result<Message<A, B>, MessageError>
45 where
46 T: EncodeMessage,
47 A: Action,
48 B: PacketBytes,
49 {
50 let mut msg = Message::new();
51 let mut encoder = MessageEncoder::new(msg.body_mut());
52 value
53 .encode(None, &mut encoder)
54 .map_err(MessageError::EncodeError)?;
55
56 Ok(msg)
57 }
58
59 pub fn decode<A, B, T>(msg: Message<A, B>) -> Result<T, MessageError>
60 where
61 A: Action,
62 B: PacketBytes,
63 T: for<'a> DecodeMessage<'a>,
64 {
65 T::parse_from_bytes(msg.body().as_slice())
66 .map_err(MessageError::DecodeError)
67 }
68}