mirror of
https://gitlab.com/xmpp-rs/xmpp-rs.git
synced 2024-07-12 22:21:53 +00:00
stanza_error: Use a mutable struct first.
This commit is contained in:
parent
fb4a3dcba8
commit
a62b184d54
1 changed files with 12 additions and 15 deletions
|
@ -242,18 +242,21 @@ impl TryFrom<Element> for StanzaError {
|
||||||
check_self!(elem, "error", DEFAULT_NS);
|
check_self!(elem, "error", DEFAULT_NS);
|
||||||
check_no_unknown_attributes!(elem, "error", ["type", "by"]);
|
check_no_unknown_attributes!(elem, "error", ["type", "by"]);
|
||||||
|
|
||||||
let type_ = get_attr!(elem, "type", Required);
|
let mut stanza_error = StanzaError {
|
||||||
let by = get_attr!(elem, "by", Option);
|
type_: get_attr!(elem, "type", Required),
|
||||||
|
by: get_attr!(elem, "by", Option),
|
||||||
|
defined_condition: DefinedCondition::UndefinedCondition,
|
||||||
|
texts: BTreeMap::new(),
|
||||||
|
other: None,
|
||||||
|
};
|
||||||
let mut defined_condition = None;
|
let mut defined_condition = None;
|
||||||
let mut texts = BTreeMap::new();
|
|
||||||
let mut other = None;
|
|
||||||
|
|
||||||
for child in elem.children() {
|
for child in elem.children() {
|
||||||
if child.is("text", ns::XMPP_STANZAS) {
|
if child.is("text", ns::XMPP_STANZAS) {
|
||||||
check_no_children!(child, "text");
|
check_no_children!(child, "text");
|
||||||
check_no_unknown_attributes!(child, "text", ["xml:lang"]);
|
check_no_unknown_attributes!(child, "text", ["xml:lang"]);
|
||||||
let lang = get_attr!(elem, "xml:lang", Default);
|
let lang = get_attr!(elem, "xml:lang", Default);
|
||||||
if texts.insert(lang, child.text()).is_some() {
|
if stanza_error.texts.insert(lang, child.text()).is_some() {
|
||||||
return Err(Error::ParseError(
|
return Err(Error::ParseError(
|
||||||
"Text element present twice for the same xml:lang.",
|
"Text element present twice for the same xml:lang.",
|
||||||
));
|
));
|
||||||
|
@ -269,24 +272,18 @@ impl TryFrom<Element> for StanzaError {
|
||||||
let condition = DefinedCondition::try_from(child.clone())?;
|
let condition = DefinedCondition::try_from(child.clone())?;
|
||||||
defined_condition = Some(condition);
|
defined_condition = Some(condition);
|
||||||
} else {
|
} else {
|
||||||
if other.is_some() {
|
if stanza_error.other.is_some() {
|
||||||
return Err(Error::ParseError(
|
return Err(Error::ParseError(
|
||||||
"Error must not have more than one other element.",
|
"Error must not have more than one other element.",
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
other = Some(child.clone());
|
stanza_error.other = Some(child.clone());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
let defined_condition =
|
stanza_error.defined_condition =
|
||||||
defined_condition.ok_or(Error::ParseError("Error must have a defined-condition."))?;
|
defined_condition.ok_or(Error::ParseError("Error must have a defined-condition."))?;
|
||||||
|
|
||||||
Ok(StanzaError {
|
Ok(stanza_error)
|
||||||
type_,
|
|
||||||
by,
|
|
||||||
defined_condition,
|
|
||||||
texts,
|
|
||||||
other,
|
|
||||||
})
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue