Make TryFrom<Element> chainable
This allows constructs like:
```rust
let residual = match Iq::try_from(stanza) {
Ok(iq) => return handle_iq(..),
Err(Error::TypeMismatch(_, _, v)) => v,
Err(other) => return handle_parse_error(..),
};
let residual = match Message::try_from(stanza) {
..
};
let residual = ..
log::warn!("unhandled object: {:?}", residual);
```
The interesting part of this is that this could be used in a loop over a
Vec<Box<dyn FnMut(Element) -> ControlFlow<SomeResult, Element>>, i.e. in
a parsing loop for a generic XML/XMPP stream.
The advantage is that the stanza.is() check runs only once (in
check_self!) and doesn't need to be duplicated outside, and it reduces
the use of magic strings.
This commit is contained in:
parent
3b3a4ff0c8
commit
2f7d5edb8a
8 changed files with 68 additions and 25 deletions
|
|
@ -37,7 +37,7 @@ macro_rules! generate_blocking_element {
|
|||
check_no_attributes!(elem, $name);
|
||||
let mut items = vec!();
|
||||
for child in elem.children() {
|
||||
check_self!(child, "item", BLOCKING);
|
||||
check_child!(child, "item", BLOCKING);
|
||||
check_no_unknown_attributes!(child, "item", ["jid"]);
|
||||
check_no_children!(child, "item");
|
||||
items.push(get_attr!(child, "jid", Required));
|
||||
|
|
|
|||
Loading…
Reference in a new issue