smoltcp/
macros.rs

1#[cfg(not(test))]
2#[cfg(feature = "log")]
3macro_rules! net_log {
4    (trace, $($arg:expr),*) => { log::trace!($($arg),*) };
5    (debug, $($arg:expr),*) => { log::debug!($($arg),*) };
6}
7
8#[cfg(test)]
9#[cfg(feature = "log")]
10macro_rules! net_log {
11    (trace, $($arg:expr),*) => { println!($($arg),*) };
12    (debug, $($arg:expr),*) => { println!($($arg),*) };
13}
14
15#[cfg(feature = "defmt")]
16macro_rules! net_log {
17    (trace, $($arg:expr),*) => { defmt::trace!($($arg),*) };
18    (debug, $($arg:expr),*) => { defmt::debug!($($arg),*) };
19}
20
21#[cfg(not(any(feature = "log", feature = "defmt")))]
22macro_rules! net_log {
23    ($level:ident, $($arg:expr),*) => {{ $( let _ = $arg; )* }}
24}
25
26macro_rules! net_trace {
27    ($($arg:expr),*) => (net_log!(trace, $($arg),*));
28}
29
30macro_rules! net_debug {
31    ($($arg:expr),*) => (net_log!(debug, $($arg),*));
32}
33
34macro_rules! enum_with_unknown {
35    (
36        $( #[$enum_attr:meta] )*
37        pub enum $name:ident($ty:ty) {
38            $(
39              $( #[$variant_attr:meta] )*
40              $variant:ident = $value:expr
41            ),+ $(,)?
42        }
43    ) => {
44        #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Clone, Copy, Hash)]
45        #[cfg_attr(feature = "defmt", derive(defmt::Format))]
46        $( #[$enum_attr] )*
47        pub enum $name {
48            $(
49              $( #[$variant_attr] )*
50              $variant
51            ),*,
52            Unknown($ty)
53        }
54
55        impl ::core::convert::From<$ty> for $name {
56            fn from(value: $ty) -> Self {
57                match value {
58                    $( $value => $name::$variant ),*,
59                    other => $name::Unknown(other)
60                }
61            }
62        }
63
64        impl ::core::convert::From<$name> for $ty {
65            fn from(value: $name) -> Self {
66                match value {
67                    $( $name::$variant => $value ),*,
68                    $name::Unknown(other) => other
69                }
70            }
71        }
72    }
73}
74
75#[cfg(feature = "proto-rpl")]
76macro_rules! get {
77    ($buffer:expr, into: $into:ty, fun: $fun:ident, field: $field:expr $(,)?) => {
78        {
79            <$into>::$fun(&$buffer.as_ref()[$field])
80        }
81    };
82
83    ($buffer:expr, into: $into:ty, field: $field:expr $(,)?) => {
84        get!($buffer, into: $into, field: $field, shift: 0, mask: 0b1111_1111)
85    };
86
87    ($buffer:expr, into: $into:ty, field: $field:expr, mask: $bit_mask:expr $(,)?) => {
88        get!($buffer, into: $into, field: $field, shift: 0, mask: $bit_mask)
89    };
90
91    ($buffer:expr, into: $into:ty, field: $field:expr, shift: $bit_shift:expr, mask: $bit_mask:expr $(,)?) => {
92        {
93            <$into>::from((&$buffer.as_ref()[$field] >> $bit_shift) & $bit_mask)
94        }
95    };
96
97    ($buffer:expr, field: $field:expr $(,)?) => {
98        get!($buffer, field: $field, shift: 0, mask: 0b1111_1111)
99    };
100
101    ($buffer:expr, field: $field:expr, mask: $bit_mask:expr $(,)?) => {
102        get!($buffer, field: $field, shift: 0, mask: $bit_mask)
103    };
104
105    ($buffer:expr, field: $field:expr, shift: $bit_shift:expr, mask: $bit_mask:expr $(,)?)
106        =>
107    {
108        {
109            (&$buffer.as_ref()[$field] >> $bit_shift) & $bit_mask
110        }
111    };
112
113    ($buffer:expr, u16, field: $field:expr $(,)?) => {
114        {
115            NetworkEndian::read_u16(&$buffer.as_ref()[$field])
116        }
117    };
118
119    ($buffer:expr, bool, field: $field:expr, shift: $bit_shift:expr, mask: $bit_mask:expr $(,)?) => {
120        {
121            (($buffer.as_ref()[$field] >> $bit_shift) & $bit_mask) == 0b1
122        }
123    };
124
125    ($buffer:expr, u32, field: $field:expr $(,)?) => {
126        {
127            NetworkEndian::read_u32(&$buffer.as_ref()[$field])
128        }
129    };
130}
131
132#[cfg(feature = "proto-rpl")]
133macro_rules! set {
134    ($buffer:expr, address: $address:ident, field: $field:expr $(,)?) => {{
135        $buffer.as_mut()[$field].copy_from_slice(&$address.octets());
136    }};
137
138    ($buffer:expr, $value:ident, field: $field:expr $(,)?) => {
139        set!($buffer, $value, field: $field, shift: 0, mask: 0b1111_1111)
140    };
141
142    ($buffer:expr, $value:ident, field: $field:expr, mask: $bit_mask:expr $(,)?) => {
143        set!($buffer, $value, field: $field, shift: 0, mask: $bit_mask)
144    };
145
146    ($buffer:expr, $value:ident, field: $field:expr, shift: $bit_shift:expr, mask: $bit_mask:expr $(,)?) => {{
147        let raw =
148            ($buffer.as_ref()[$field] & !($bit_mask << $bit_shift)) | ($value << $bit_shift);
149        $buffer.as_mut()[$field] = raw;
150    }};
151
152    ($buffer:expr, $value:ident, bool, field: $field:expr, mask: $bit_mask:expr $(,)?) => {
153        set!($buffer, $value, bool, field: $field, shift: 0, mask: $bit_mask);
154    };
155
156    ($buffer:expr, $value:ident, bool, field: $field:expr, shift: $bit_shift:expr, mask: $bit_mask:expr $(,)?) => {{
157        let raw = ($buffer.as_ref()[$field] & !($bit_mask << $bit_shift))
158            | (if $value { 0b1 } else { 0b0 } << $bit_shift);
159        $buffer.as_mut()[$field] = raw;
160    }};
161
162    ($buffer:expr, $value:ident, u16, field: $field:expr $(,)?) => {{
163        NetworkEndian::write_u16(&mut $buffer.as_mut()[$field], $value);
164    }};
165
166    ($buffer:expr, $value:ident, u32, field: $field:expr $(,)?) => {{
167        NetworkEndian::write_u32(&mut $buffer.as_mut()[$field], $value);
168    }};
169}