xmpp-parsers: Remove the generate_element!() macro
The last users have now been converted to xso.
This commit is contained in:
parent
4f81411410
commit
d706b318c3
1 changed files with 0 additions and 298 deletions
|
@ -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) => (
|
||||
|
|
Loading…
Reference in a new issue