diff options
author | Simon THOBY <git@nightmared.fr> | 2022-12-03 22:47:53 +0100 |
---|---|---|
committer | Simon THOBY <git@nightmared.fr> | 2022-12-03 22:50:09 +0100 |
commit | 4b60b3cd41f5198c47a260ce69abf4c15b60ca92 (patch) | |
tree | ef3b7df96306820fc35db909762ac3c4227de87f /src/parser.rs | |
parent | 3b11070076f0509f9423d6c4f582f6cf636df65a (diff) |
convert the expressions to the new macros
Diffstat (limited to 'src/parser.rs')
-rw-r--r-- | src/parser.rs | 190 |
1 files changed, 0 insertions, 190 deletions
diff --git a/src/parser.rs b/src/parser.rs index 834874c..7d89a1e 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -400,81 +400,6 @@ pub trait InnerFormat { ) -> Result<DebugStruct<'a, 'b>, std::fmt::Error>; } -#[macro_export] -macro_rules! impl_attr_getters_and_setters { - (without_deser $struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - impl $struct { - $( - #[allow(dead_code)] - pub fn $getter_name(&self) -> Option<&$type> { - self.$internal_name.as_ref() - } - - #[allow(dead_code)] - pub fn $setter_name(&mut self, val: impl Into<$type>) { - self.$internal_name = Some(val.into()); - } - - #[allow(dead_code)] - pub fn $in_place_edit_name(mut self, val: impl Into<$type>) -> Self { - self.$internal_name = Some(val.into()); - self - } - - )+ - } - - impl $crate::parser::InnerFormat for $struct { - fn inner_format_struct<'a, 'b: 'a>(&'a self, mut s: std::fmt::DebugStruct<'a, 'b>) -> Result<std::fmt::DebugStruct<'a, 'b>, std::fmt::Error> { - $( - // Rewrite attributes names to be readable: 'sys::NFTA_CHAIN_NAME' -> 'name' - // Performance must be terrible, but this is the Debug impl anyway, so that - // must mean we can afford to be slow, right? ;) - if let Some(val) = self.$getter_name() { - let mut attr = stringify!($attr_name); - if let Some((nfta_idx, _match )) = attr.rmatch_indices("NFTA_").next() { - if let Some(underscore_idx) = &attr[nfta_idx+5..].find('_') { - attr = &attr[nfta_idx+underscore_idx+6..]; - } - } - let attr = attr.to_lowercase(); - s.field(&attr, val); - } - )+ - Ok(s) - } - } - - }; - (deser $struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - impl $crate::nlmsg::AttributeDecoder for $struct { - #[allow(dead_code)] - fn decode_attribute(&mut self, attr_type: u16, buf: &[u8]) -> Result<(), $crate::parser::DecodeError> { - use $crate::nlmsg::NfNetlinkDeserializable; - debug!("Decoding attribute {} in type {}", attr_type, std::any::type_name::<$struct>()); - match attr_type { - $( - x if x == $attr_name => { - debug!("Calling {}::deserialize()", std::any::type_name::<$type>()); - let (val, remaining) = <$type>::deserialize(buf)?; - if remaining.len() != 0 { - return Err($crate::parser::DecodeError::InvalidDataSize); - } - self.$setter_name(val); - Ok(()) - }, - )+ - _ => Err($crate::parser::DecodeError::UnsupportedAttributeType(attr_type)), - } - } - } - }; - ($struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - $crate::impl_attr_getters_and_setters!(without_deser $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - $crate::impl_attr_getters_and_setters!(deser $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - }; -} - pub trait Parsable where Self: Sized, @@ -520,118 +445,3 @@ where Ok((res, nfgenmsg, remaining_data)) } } - -#[macro_export] -macro_rules! impl_nfnetlinkattribute { - (__inner : $struct:ident, [$(($attr_name:expr, $internal_name:ident)),+]) => { - impl $struct { - fn inner_get_size(&self) -> usize { - use $crate::nlmsg::NfNetlinkAttribute; - use $crate::parser::{pad_netlink_object, pad_netlink_object_with_variable_size}; - use $crate::sys::nlattr; - let mut size = 0; - - $( - if let Some(val) = &self.$internal_name { - // Attribute header + attribute value - size += pad_netlink_object::<nlattr>() - + pad_netlink_object_with_variable_size(val.get_size()); - } - )+ - - size - } - - unsafe fn inner_write_payload(&self, mut addr: *mut u8) { - use $crate::nlmsg::NfNetlinkAttribute; - use $crate::parser::{pad_netlink_object, pad_netlink_object_with_variable_size}; - use $crate::sys::nlattr; - $( - if let Some(val) = &self.$internal_name { - debug!("writing attribute {} - {:?}", $attr_name, val); - - unsafe { - $crate::parser::write_attribute($attr_name, val, addr); - } - let size = pad_netlink_object::<nlattr>() - + pad_netlink_object_with_variable_size(val.get_size()); - #[allow(unused)] - { - addr = addr.offset(size as isize); - } - } - )+ - } - } - }; - (inline : $struct:ident, [$(($attr_name:expr, $internal_name:ident)),+]) => { - $crate::impl_nfnetlinkattribute!(__inner : $struct, [$(($attr_name, $internal_name)),+]); - - impl $crate::nlmsg::NfNetlinkAttribute for $struct { - fn get_size(&self) -> usize { - self.inner_get_size() - } - - unsafe fn write_payload(&self, addr: *mut u8) { - self.inner_write_payload(addr); - } - } - }; - (nested : $struct:ident, [$(($attr_name:expr, $internal_name:ident)),+]) => { - $crate::impl_nfnetlinkattribute!(__inner : $struct, [$(($attr_name, $internal_name)),+]); - - impl $crate::nlmsg::NfNetlinkAttribute for $struct { - fn is_nested(&self) -> bool { - true - } - - fn get_size(&self) -> usize { - self.inner_get_size() - } - - unsafe fn write_payload(&self, addr: *mut u8) { - self.inner_write_payload(addr); - } - } - }; -} - -#[macro_export] -macro_rules! create_wrapper_type { - (without_deser : $struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - #[derive(Clone, PartialEq, Eq, Default)] - pub struct $struct { - $( - $internal_name: Option<$type> - ),+ - } - - $crate::impl_attr_getters_and_setters!(without_deser $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - - impl std::fmt::Debug for $struct { - fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { - use $crate::parser::InnerFormat; - self.inner_format_struct(f.debug_struct(stringify!($struct)))? - .finish() - } - } - - impl $crate::nlmsg::NfNetlinkDeserializable for $struct { - fn deserialize(buf: &[u8]) -> Result<(Self, &[u8]), $crate::parser::DecodeError> { - Ok(($crate::parser::read_attributes(buf)?, &[])) - } - } - }; - ($struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - create_wrapper_type!(without_deser : $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - $crate::impl_attr_getters_and_setters!(deser $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - }; - (inline $($($attrs:ident) +)? : $struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - create_wrapper_type!($($($attrs) + :)? $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - $crate::impl_nfnetlinkattribute!(inline : $struct, [$(($attr_name, $internal_name)),+]); - }; - (nested $($($attrs:ident) +)? : $struct:ident, [$(($getter_name:ident, $setter_name:ident, $in_place_edit_name:ident, $attr_name:expr, $internal_name:ident, $type:ty)),+]) => { - create_wrapper_type!($($($attrs) + :)? $struct, [$(($getter_name, $setter_name, $in_place_edit_name, $attr_name, $internal_name, $type)),+]); - $crate::impl_nfnetlinkattribute!(nested : $struct, [$(($attr_name, $internal_name)),+]); - }; -} |