lafere_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::{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}