From ff26cf505655e171ea736bb8481f76c0a65a431b Mon Sep 17 00:00:00 2001 From: Lennart <18233294+lennart-k@users.noreply.github.com> Date: Fri, 27 Dec 2024 13:03:52 +0100 Subject: [PATCH] xml: Fix field serialization and add value serialization --- crates/xml/derive/src/field.rs | 4 ++-- crates/xml/src/value.rs | 30 +++++++++++++++++++++++-- crates/xml/tests/se_struct.rs | 41 ++++++++++++++++++++++++++++++++-- 3 files changed, 69 insertions(+), 6 deletions(-) diff --git a/crates/xml/derive/src/field.rs b/crates/xml/derive/src/field.rs index ed763cd..4cdf408 100644 --- a/crates/xml/derive/src/field.rs +++ b/crates/xml/derive/src/field.rs @@ -258,10 +258,10 @@ impl Field { writer.write_event(Event::Text(BytesText::new(&self.#field_ident)))?; }), FieldType::Tag => Some(quote! { - self.#field_ident.serialize(None, Some(#field_name), writer)?; + ::rustical_xml::XmlSerialize::serialize(&self.#field_ident, None, Some(#field_name), writer)?; }), FieldType::Untagged => Some(quote! { - self.#field_ident.serialize(None, None, writer)?; + ::rustical_xml::XmlSerialize::serialize(&self.#field_ident, None, None, writer)?; }), // TODO: Think about what to do here FieldType::TagName | FieldType::Namespace => None, diff --git a/crates/xml/src/value.rs b/crates/xml/src/value.rs index 56e79e3..5fbd3bd 100644 --- a/crates/xml/src/value.rs +++ b/crates/xml/src/value.rs @@ -1,9 +1,9 @@ -use quick_xml::events::{BytesStart, Event}; +use quick_xml::events::{BytesEnd, BytesStart, BytesText, Event}; use std::num::{ParseFloatError, ParseIntError}; use std::{convert::Infallible, io::BufRead}; use thiserror::Error; -use crate::{XmlDeError, XmlDeserialize}; +use crate::{XmlDeError, XmlDeserialize, XmlSerialize}; #[derive(Debug, Error)] pub enum ParseValueError { @@ -79,3 +79,29 @@ impl XmlDeserialize for T { Value::deserialize(&string) } } + +impl XmlSerialize for T { + fn serialize( + &self, + ns: Option<&[u8]>, + tag: Option<&[u8]>, + writer: &mut quick_xml::Writer, + ) -> std::io::Result<()> { + let tag_str = tag.map(String::from_utf8_lossy); + + if let Some(tag) = &tag_str { + writer.write_event(Event::Start(BytesStart::new(tag.clone())))?; + } + writer.write_event(Event::Text(BytesText::new(&self.serialize())))?; + + if let Some(tag) = &tag_str { + writer.write_event(Event::End(BytesEnd::new(tag.clone())))?; + } + Ok(()) + } + + #[allow(refining_impl_trait)] + fn attributes<'a>(&self) -> Vec> { + vec![] + } +} diff --git a/crates/xml/tests/se_struct.rs b/crates/xml/tests/se_struct.rs index 5e99fb3..78f2b67 100644 --- a/crates/xml/tests/se_struct.rs +++ b/crates/xml/tests/se_struct.rs @@ -25,7 +25,6 @@ fn test_struct_document() { .serialize_root(&mut writer) .unwrap(); let out = String::from_utf8(buf).unwrap(); - dbg!(out); } #[test] @@ -56,5 +55,43 @@ fn test_struct_untagged_attr() { .serialize_root(&mut writer) .unwrap(); let out = String::from_utf8(buf).unwrap(); - dbg!(out); +} + +#[test] +fn test_struct_value_tagged() { + #[derive(Debug, XmlRootTag, XmlSerialize, PartialEq)] + #[xml(root = b"document")] + struct Document { + href: String, + } + + let mut buf = Vec::new(); + let mut writer = quick_xml::Writer::new(&mut buf); + Document { + href: "okay".to_owned(), + } + .serialize_root(&mut writer) + .unwrap(); + let out = String::from_utf8(buf).unwrap(); + assert_eq!(out, "okay"); +} + +#[test] +fn test_struct_value_untagged() { + #[derive(Debug, XmlRootTag, XmlSerialize, PartialEq)] + #[xml(root = b"document")] + struct Document { + #[xml(ty = "untagged")] + href: String, + } + + let mut buf = Vec::new(); + let mut writer = quick_xml::Writer::new(&mut buf); + Document { + href: "okay".to_owned(), + } + .serialize_root(&mut writer) + .unwrap(); + let out = String::from_utf8(buf).unwrap(); + assert_eq!(out, "okay"); }