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)]
|
#[cfg(test)]
|
||||||
macro_rules! assert_size (
|
macro_rules! assert_size (
|
||||||
($t:ty, $sz:expr) => (
|
($t:ty, $sz:expr) => (
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue