smb_msg/
message.rs

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}