From 5bd58698d7f60937b3728e0937cdde66930ee373 Mon Sep 17 00:00:00 2001 From: Dirkjan Ochtman Date: Tue, 29 Nov 2022 12:14:24 +0100 Subject: [PATCH] Simplify logic for serializing prefixes --- instant-xml-macros/src/ser.rs | 6 +++--- instant-xml/src/impls.rs | 4 ++-- instant-xml/src/ser.rs | 34 ++++++++++++---------------------- 3 files changed, 17 insertions(+), 27 deletions(-) diff --git a/instant-xml-macros/src/ser.rs b/instant-xml-macros/src/ser.rs index 87f1a61..d5f93ed 100644 --- a/instant-xml-macros/src/ser.rs +++ b/instant-xml-macros/src/ser.rs @@ -54,7 +54,7 @@ fn serialize_scalar_enum( ) -> Result<(), instant_xml::Error> { let prefix = match field { Some(id) => { - let prefix = serializer.write_start(id.name, id.ns, true)?; + let prefix = serializer.write_start(id.name, id.ns)?; serializer.end_start()?; Some((prefix, id.name)) } @@ -143,7 +143,7 @@ fn serialize_wrapped_enum( serializer: &mut instant_xml::Serializer, ) -> Result<(), instant_xml::Error> { // Start tag - let prefix = serializer.write_start(#tag, #default_namespace, false)?; + let prefix = serializer.write_start(#tag, #default_namespace)?; debug_assert_eq!(prefix, None); // Set up element context, this will also emit namespace declarations @@ -234,7 +234,7 @@ fn serialize_struct( serializer: &mut instant_xml::Serializer, ) -> Result<(), instant_xml::Error> { // Start tag - let prefix = serializer.write_start(#tag, #default_namespace, false)?; + let prefix = serializer.write_start(#tag, #default_namespace)?; debug_assert_eq!(prefix, None); // Set up element context, this will also emit namespace declarations diff --git a/instant-xml/src/impls.rs b/instant-xml/src/impls.rs index ab2392f..ced4cc3 100644 --- a/instant-xml/src/impls.rs +++ b/instant-xml/src/impls.rs @@ -69,7 +69,7 @@ where ) -> Result<(), Error> { let prefix = match field { Some(id) => { - let prefix = serializer.write_start(id.name, id.ns, true)?; + let prefix = serializer.write_start(id.name, id.ns)?; serializer.end_start()?; Some((prefix, id.name)) } @@ -489,7 +489,7 @@ impl ToXml for DateTime { ) -> Result<(), Error> { let prefix = match field { Some(id) => { - let prefix = serializer.write_start(id.name, id.ns, true)?; + let prefix = serializer.write_start(id.name, id.ns)?; serializer.end_start()?; Some((prefix, id.name)) } diff --git a/instant-xml/src/ser.rs b/instant-xml/src/ser.rs index 18d1e74..773c8ca 100644 --- a/instant-xml/src/ser.rs +++ b/instant-xml/src/ser.rs @@ -28,35 +28,25 @@ impl<'xml, W: fmt::Write + ?Sized> Serializer<'xml, W> { } } - pub fn write_start( - &mut self, - name: &str, - ns: &str, - scalar: bool, - ) -> Result, Error> { + pub fn write_start(&mut self, name: &str, ns: &str) -> Result, Error> { if self.state != State::Element { return Err(Error::UnexpectedState("invalid state for element start")); } - let prefix = match ns == self.default_ns { - true => { + let prefix = match (ns == self.default_ns, self.prefixes.get(ns)) { + (true, _) => { self.output.write_fmt(format_args!("<{name}"))?; None } - // In the case of scalars, we can use the prefix instead of setting a - // default namespace (since there are no child elements that will - // expect the default namespace to be set). - false => match (scalar, self.prefixes.get(ns)) { - (false, _) | (true, None) => { - self.output - .write_fmt(format_args!("<{name} xmlns=\"{ns}\""))?; - None - } - (true, Some(&prefix)) => { - self.output.write_fmt(format_args!("<{prefix}:{name}"))?; - Some(prefix) - } - }, + (false, Some(prefix)) => { + self.output.write_fmt(format_args!("<{prefix}:{name}"))?; + Some(*prefix) + } + _ => { + self.output + .write_fmt(format_args!("<{name} xmlns=\"{ns}\""))?; + None + } }; self.state = State::Attribute;