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