stanza_error: Use a mutable struct first.

Emmanuel Gil Peyrot created

Change summary

src/stanza_error.rs | 27 ++++++++++++---------------
1 file changed, 12 insertions(+), 15 deletions(-)

Detailed changes

src/stanza_error.rs 🔗

@@ -242,18 +242,21 @@ impl TryFrom<Element> for StanzaError {
         check_self!(elem, "error", DEFAULT_NS);
         check_no_unknown_attributes!(elem, "error", ["type", "by"]);
 
-        let type_ = get_attr!(elem, "type", Required);
-        let by = get_attr!(elem, "by", Option);
+        let mut stanza_error = StanzaError {
+            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 texts = BTreeMap::new();
-        let mut other = None;
 
         for child in elem.children() {
             if child.is("text", ns::XMPP_STANZAS) {
                 check_no_children!(child, "text");
                 check_no_unknown_attributes!(child, "text", ["xml:lang"]);
                 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(
                         "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())?;
                 defined_condition = Some(condition);
             } else {
-                if other.is_some() {
+                if stanza_error.other.is_some() {
                     return Err(Error::ParseError(
                         "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."))?;
 
-        Ok(StanzaError {
-            type_,
-            by,
-            defined_condition,
-            texts,
-            other,
-        })
+        Ok(stanza_error)
     }
 }