xmpp-parsers: Remove the generate_element!() macro

Emmanuel Gil Peyrot created

The last users have now been converted to xso.

Change summary

parsers/src/util/macros.rs | 298 ----------------------------------------
1 file changed, 298 deletions(-)

Detailed changes

parsers/src/util/macros.rs 🔗

@@ -482,304 +482,6 @@ macro_rules! generate_elem_id {
     );
 }
 
-macro_rules! decl_attr {
-    (OptionEmpty, $type:ty) => (
-        Option<$type>
-    );
-    (Option, $type:ty) => (
-        Option<$type>
-    );
-    (Required, $type:ty) => (
-        $type
-    );
-    (RequiredNonEmpty, $type:ty) => (
-        $type
-    );
-    (Default, $type:ty) => (
-        $type
-    );
-}
-
-macro_rules! start_decl {
-    (Vec, $type:ty) => (
-        Vec<$type>
-    );
-    (Option, $type:ty) => (
-        Option<$type>
-    );
-    (Required, $type:ty) => (
-        $type
-    );
-    (Present, $type:ty) => (
-        bool
-    );
-}
-
-macro_rules! start_parse_elem {
-    ($temp:ident: Vec) => {
-        let mut $temp = Vec::new();
-    };
-    ($temp:ident: Option) => {
-        let mut $temp = None;
-    };
-    ($temp:ident: Required) => {
-        let mut $temp = None;
-    };
-    ($temp:ident: Present) => {
-        let mut $temp = false;
-    };
-}
-
-macro_rules! do_parse {
-    ($elem:ident, Element) => {
-        Ok($elem)
-    };
-    ($elem:ident, String) => {
-        Ok($elem.text())
-    };
-    ($elem:ident, $constructor:ident) => {
-        $constructor::try_from($elem).map_err(xso::error::Error::from)
-    };
-}
-
-macro_rules! do_parse_elem {
-    ($temp:ident: Vec = $constructor:ident => $elem:ident, $name:tt, $parent_name:tt) => {
-        match do_parse!($elem, $constructor) {
-            Ok(v) => Ok($temp.push(v)),
-            Err(e) => Err(e),
-        }
-    };
-    ($temp:ident: Option = $constructor:ident => $elem:ident, $name:tt, $parent_name:tt) => {
-        if $temp.is_some() {
-            Err(xso::error::Error::Other(
-                concat!(
-                    "Element ",
-                    $parent_name,
-                    " must not have more than one ",
-                    $name,
-                    " child."
-                )
-                .into(),
-            ))
-        } else {
-            match do_parse!($elem, $constructor) {
-                Ok(v) => {
-                    $temp = Some(v);
-                    Ok(())
-                }
-                Err(e) => Err(e),
-            }
-        }
-    };
-    ($temp:ident: Required = $constructor:ident => $elem:ident, $name:tt, $parent_name:tt) => {
-        if $temp.is_some() {
-            Err(xso::error::Error::Other(
-                concat!(
-                    "Element ",
-                    $parent_name,
-                    " must not have more than one ",
-                    $name,
-                    " child."
-                )
-                .into(),
-            ))
-        } else {
-            match do_parse!($elem, $constructor) {
-                Ok(v) => {
-                    $temp = Some(v);
-                    Ok(())
-                }
-                Err(e) => Err(e),
-            }
-        }
-    };
-    ($temp:ident: Present = $constructor:ident => $elem:ident, $name:tt, $parent_name:tt) => {
-        if $temp {
-            Err(xso::error::Error::Other(
-                concat!(
-                    "Element ",
-                    $parent_name,
-                    " must not have more than one ",
-                    $name,
-                    " child."
-                )
-                .into(),
-            ))
-        } else {
-            $temp = true;
-            Ok(())
-        }
-    };
-}
-
-macro_rules! finish_parse_elem {
-    ($temp:ident: Vec = $name:tt, $parent_name:tt) => {
-        $temp
-    };
-    ($temp:ident: Option = $name:tt, $parent_name:tt) => {
-        $temp
-    };
-    ($temp:ident: Required = $name:tt, $parent_name:tt) => {
-        $temp.ok_or(xso::error::Error::Other(
-            concat!("Missing child ", $name, " in ", $parent_name, " element.").into(),
-        ))?
-    };
-    ($temp:ident: Present = $name:tt, $parent_name:tt) => {
-        $temp
-    };
-}
-
-macro_rules! generate_serialiser {
-    ($builder:ident, $parent:ident, $elem:ident, Required, String, ($name:tt, $ns:ident)) => {
-        $builder.append(
-            minidom::Element::builder($name, crate::ns::$ns)
-                .append(::minidom::Node::Text($parent.$elem)),
-        )
-    };
-    ($builder:ident, $parent:ident, $elem:ident, Option, String, ($name:tt, $ns:ident)) => {
-        $builder.append_all($parent.$elem.map(|elem| {
-            minidom::Element::builder($name, crate::ns::$ns).append(::minidom::Node::Text(elem))
-        }))
-    };
-    ($builder:ident, $parent:ident, $elem:ident, Option, $constructor:ident, ($name:tt, *)) => {
-        $builder.append_all(
-            $parent
-                .$elem
-                .map(|elem| ::minidom::Node::Element(minidom::Element::from(elem))),
-        )
-    };
-    ($builder:ident, $parent:ident, $elem:ident, Option, $constructor:ident, ($name:tt, $ns:ident)) => {
-        $builder.append_all(
-            $parent
-                .$elem
-                .map(|elem| ::minidom::Node::Element(minidom::Element::from(elem))),
-        )
-    };
-    ($builder:ident, $parent:ident, $elem:ident, Vec, $constructor:ident, ($name:tt, $ns:ident)) => {
-        $builder.append_all($parent.$elem.into_iter())
-    };
-    ($builder:ident, $parent:ident, $elem:ident, Present, $constructor:ident, ($name:tt, $ns:ident)) => {
-        $builder.append_all(
-            $parent
-                .$elem
-                .then(|| minidom::Element::builder($name, crate::ns::$ns)),
-        )
-    };
-    ($builder:ident, $parent:ident, $elem:ident, $_:ident, $constructor:ident, ($name:tt, $ns:ident)) => {
-        $builder.append(::minidom::Node::Element(minidom::Element::from(
-            $parent.$elem,
-        )))
-    };
-}
-
-macro_rules! generate_child_test {
-    ($child:ident, $name:tt, *) => {
-        $child.is($name, ::minidom::NSChoice::Any)
-    };
-    ($child:ident, $name:tt, $ns:tt) => {
-        $child.is($name, crate::ns::$ns)
-    };
-}
-
-macro_rules! generate_element {
-    ($(#[$meta:meta])* $elem:ident, $name:tt, $ns:ident, attributes: [$($(#[$attr_meta:meta])* $attr:ident: $attr_action:tt<$attr_type:ty> = $attr_name:tt),+$(,)?]) => (
-        generate_element!($(#[$meta])* $elem, $name, $ns, attributes: [$($(#[$attr_meta])* $attr: $attr_action<$attr_type> = $attr_name),*], children: []);
-    );
-    ($(#[$meta:meta])* $elem:ident, $name:tt, $ns:ident, children: [$($(#[$child_meta:meta])* $child_ident:ident: $coucou:tt<$child_type:ty> = ($child_name:tt, $child_ns:tt) => $child_constructor:ident),+$(,)?]) => (
-        generate_element!($(#[$meta])* $elem, $name, $ns, attributes: [], children: [$($(#[$child_meta])* $child_ident: $coucou<$child_type> = ($child_name, $child_ns) => $child_constructor),*]);
-    );
-    ($(#[$meta:meta])* $elem:ident, $name:tt, $ns:ident, attributes: [$($(#[$attr_meta:meta])* $attr:ident: $attr_action:tt<$attr_type:ty> = $attr_name:tt),*$(,)?], children: [$($(#[$child_meta:meta])* $child_ident:ident: $coucou:tt<$child_type:ty> = ($child_name:tt, $child_ns:tt) => $child_constructor:ident),*$(,)?]) => (
-        $(#[$meta])*
-        #[derive(Debug, Clone, PartialEq)]
-        pub struct $elem {
-            $(
-                $(#[$attr_meta])*
-                pub $attr: decl_attr!($attr_action, $attr_type),
-            )*
-            $(
-                $(#[$child_meta])*
-                pub $child_ident: start_decl!($coucou, $child_type),
-            )*
-        }
-
-        impl ::xso::FromXml for $elem {
-            type Builder = ::xso::minidom_compat::FromEventsViaElement<$elem>;
-
-            fn from_events(
-                qname: ::xso::exports::rxml::QName,
-                attrs: ::xso::exports::rxml::AttrMap,
-            ) -> Result<Self::Builder, ::xso::error::FromEventsError> {
-                if qname.0 != crate::ns::$ns || qname.1 != $name {
-                    return Err(::xso::error::FromEventsError::Mismatch {
-                        name: qname,
-                        attrs,
-                    })
-                }
-                Self::Builder::new(qname, attrs)
-            }
-        }
-
-        impl ::std::convert::TryFrom<minidom::Element> for $elem {
-            type Error = xso::error::FromElementError;
-
-            fn try_from(mut elem: minidom::Element) -> Result<$elem, xso::error::FromElementError> {
-                check_self!(elem, $name, $ns);
-                check_no_unknown_attributes!(elem, $name, [$($attr_name),*]);
-                $(
-                    start_parse_elem!($child_ident: $coucou);
-                )*
-                for _child in elem.take_contents_as_children() {
-                    let residual = _child;
-                    $(
-                    // TODO: get rid of the explicit generate_child_test here
-                    // once !295 has landed.
-                    let residual = if generate_child_test!(residual, $child_name, $child_ns) {
-                        match do_parse_elem!($child_ident: $coucou = $child_constructor => residual, $child_name, $name) {
-                            Ok(()) => continue,
-                            Err(other) => return Err(other.into()),
-                        }
-                    } else {
-                        residual
-                    };
-                    )*
-                    let _ = residual;
-                    return Err(xso::error::Error::Other(concat!("Unknown child in ", $name, " element.")).into());
-                }
-                Ok($elem {
-                    $(
-                        $attr: get_attr!(elem, $attr_name, $attr_action),
-                    )*
-                    $(
-                        $child_ident: finish_parse_elem!($child_ident: $coucou = $child_name, $name),
-                    )*
-                })
-            }
-        }
-
-        impl From<$elem> for minidom::Element {
-            fn from(elem: $elem) -> minidom::Element {
-                let mut builder = minidom::Element::builder($name, crate::ns::$ns);
-                $(
-                    builder = builder.attr($attr_name, elem.$attr);
-                )*
-                $(
-                    builder = generate_serialiser!(builder, elem, $child_ident, $coucou, $child_constructor, ($child_name, $child_ns));
-                )*
-
-                builder.build()
-            }
-        }
-
-        impl ::xso::AsXml for $elem {
-            type ItemIter<'x> = ::xso::minidom_compat::AsItemsViaElement<'x>;
-
-            fn as_xml_iter(&self) -> Result<Self::ItemIter<'_>, ::xso::error::Error> {
-                ::xso::minidom_compat::AsItemsViaElement::new(self.clone())
-            }
-        }
-    );
-}
-
 #[cfg(test)]
 macro_rules! assert_size (
     ($t:ty, $sz:expr) => (