diff --git a/src/chatstates.rs b/src/chatstates.rs index ecbecdffc4135dbfe7b50aa68aafbb57a9e5402e..995cd11e0a11ccb42f63f79689b0e85634c33c69 100644 --- a/src/chatstates.rs +++ b/src/chatstates.rs @@ -38,15 +38,9 @@ impl TryFrom for ChatState { type Err = Error; fn try_from(elem: Element) -> Result { - if !elem.has_ns(ns::CHATSTATES) { - return Err(Error::ParseError("This is not a chatstate element.")); - } - for _ in elem.children() { - return Err(Error::ParseError("Unknown child in chatstate element.")); - } - for _ in elem.attrs() { - return Err(Error::ParseError("Unknown attribute in chatstate element.")); - } + check_ns_only!(elem, "chatstate", ns::CHATSTATES); + check_no_children!(elem, "chatstate"); + check_no_unknown_attributes!(elem, "chatstate", []); Ok(match elem.name() { "active" => ChatState::Active, "composing" => ChatState::Composing, diff --git a/src/lib.rs b/src/lib.rs index 9f3b80bb68bf3c236f70389899fc48bda272dfd2..5b52da0564111cd31c848590aa8ab549ab98ee6a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -138,6 +138,14 @@ macro_rules! check_self { ); } +macro_rules! check_ns_only { + ($elem:ident, $name:tt, $ns:expr) => ( + if !$elem.has_ns($ns) { + return Err(Error::ParseError(concat!("This is not a ", $name, " element."))); + } + ); +} + macro_rules! check_no_children { ($elem:ident, $name:tt) => ( for _ in $elem.children() {