1use binrw::prelude::*;
2
3macro_rules! make_message {
4 ($name:ident, $binrw_type:ident, $plain_type:ty) => {
5 #[binrw::$binrw_type]
6 #[derive(Debug)]
7 #[brw(little)]
8 pub enum $name {
9 Plain($plain_type),
10 Encrypted($crate::EncryptedMessage),
11 Compressed($crate::CompressedMessage),
12 }
13 };
14}
15
16macro_rules! make_messages {
17 ($req_type:ident, $res_type:ident) => {
18 make_message!(Request, $req_type, $crate::PlainRequest);
19 make_message!(Response, $res_type, $crate::PlainResponse);
20 };
21}
22
23#[cfg(all(feature = "client", not(feature = "server")))]
24make_messages!(binwrite, binread);
25
26#[cfg(all(feature = "server", not(feature = "client")))]
27make_messages!(binread, binwrite);
28
29#[cfg(all(feature = "server", feature = "client"))]
30make_messages!(binrw, binrw);
31
32impl TryFrom<&[u8]> for Response {
33 type Error = binrw::Error;
34 fn try_from(value: &[u8]) -> Result<Self, Self::Error> {
35 Response::read(&mut std::io::Cursor::new(value))
36 }
37}