fire_stream_api/
encdec.rs

1#[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}