Skip to content

Commit d30e8b2

Browse files
committed
Add write_serializable to writer and improve testing
1 parent 3ab9ecc commit d30e8b2

File tree

2 files changed

+120
-30
lines changed

2 files changed

+120
-30
lines changed

src/writer.rs

Lines changed: 119 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -265,6 +265,32 @@ impl<W: Write> Writer<W> {
265265
start_tag: BytesStart::new(name.as_ref()),
266266
}
267267
}
268+
269+
/// Write an arbitrary serializable object
270+
#[cfg(feature = "serialize")]
271+
pub fn write_serializable<T: Serialize>(
272+
&mut self,
273+
content: &T,
274+
) -> std::result::Result<(), DeError> {
275+
use crate::se::Serializer;
276+
277+
self.write_indent()?;
278+
let indent = self.indent.clone();
279+
let mut fmt = ToFmtWrite(self.get_mut());
280+
let mut serializer = Serializer::new(&mut fmt);
281+
282+
if let Some(indent) = indent {
283+
serializer.indent(
284+
indent.indent_char as char,
285+
indent.indent_size,
286+
indent.current_indent_len,
287+
);
288+
}
289+
290+
content.serialize(serializer)?;
291+
292+
Ok(())
293+
}
268294
}
269295

270296
/// A struct to write an element. Contains methods to add attributes and inner
@@ -358,7 +384,8 @@ impl<'a, W: Write> ElementWriter<'a, W> {
358384
self.writer.write_indent()?;
359385

360386
let indent = self.writer.indent.clone();
361-
let mut serializer = Serializer::new(ToFmtWrite(self.writer.inner()));
387+
let fmt = &mut ToFmtWrite(self.writer.get_mut());
388+
let mut serializer = Serializer::new(fmt);
362389

363390
if let Some(indent) = indent {
364391
serializer.indent(
@@ -679,11 +706,20 @@ mod indentation {
679706
}
680707

681708
#[cfg(feature = "serialize")]
682-
#[test]
683-
fn element_writer_serialize() {
709+
mod write_serializable {
710+
use super::*;
711+
684712
#[derive(Serialize)]
685713
struct Foo {
686-
bar: Bar,
714+
#[serde(rename = "@attribute")]
715+
attribute: &'static str,
716+
717+
element: Bar,
718+
list: Vec<&'static str>,
719+
720+
#[serde(rename = "$text")]
721+
text: &'static str,
722+
687723
val: String,
688724
}
689725

@@ -693,31 +729,85 @@ mod indentation {
693729
bat: usize,
694730
}
695731

696-
let mut buffer = Vec::new();
697-
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
698-
let content = Foo {
699-
bar: Bar { baz: 42, bat: 43 },
700-
val: "foo".to_owned(),
701-
};
702-
703-
writer
704-
.create_element("paired")
705-
.with_attribute(("attr1", "value1"))
706-
.with_attribute(("attr2", "value2"))
707-
.write_serializable_content(&content)
708-
.expect("failure");
732+
#[cfg(feature = "serialize")]
733+
#[test]
734+
fn serializable() {
735+
let mut buffer = Vec::new();
736+
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
737+
738+
let content = Foo {
739+
attribute: "attribute",
740+
element: Bar { baz: 42, bat: 43 },
741+
list: vec!["first element", "second element"],
742+
text: "text",
743+
val: "foo".to_owned(),
744+
};
745+
746+
let start = BytesStart::new("paired")
747+
.with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter());
748+
let end = start.to_end();
749+
750+
writer
751+
.write_event(Event::Start(start.clone()))
752+
.expect("write start tag failed");
753+
writer
754+
.write_serializable(&content)
755+
.expect("write serializable inner contents failed");
756+
writer
757+
.write_event(Event::End(end))
758+
.expect("write end tag failed");
759+
760+
assert_eq!(
761+
std::str::from_utf8(&buffer).unwrap(),
762+
r#"<paired attr1="value1" attr2="value2">
763+
<Foo attribute="attribute">
764+
<element>
765+
<baz>42</baz>
766+
<bat>43</bat>
767+
</element>
768+
<list>first element</list>
769+
<list>second element</list>
770+
text
771+
<val>foo</val>
772+
</Foo>
773+
</paired>"#
774+
);
775+
}
709776

710-
assert_eq!(
711-
std::str::from_utf8(&buffer).unwrap(),
712-
r#"<paired attr1="value1" attr2="value2">
713-
<Foo>
714-
<bar>
715-
<baz>42</baz>
716-
<bat>43</bat>
717-
</bar>
718-
<val>foo</val>
719-
</Foo>
720-
</paired>"#
721-
);
777+
#[test]
778+
fn element_writer_serializable() {
779+
let mut buffer = Vec::new();
780+
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
781+
let content = Foo {
782+
attribute: "attribute",
783+
element: Bar { baz: 42, bat: 43 },
784+
list: vec!["first element", "second element"],
785+
text: "text",
786+
val: "foo".to_string(),
787+
};
788+
789+
writer
790+
.create_element("paired")
791+
.with_attribute(("attr1", "value1"))
792+
.with_attribute(("attr2", "value2"))
793+
.write_serializable_content(&content)
794+
.expect("failure");
795+
796+
assert_eq!(
797+
std::str::from_utf8(&buffer).unwrap(),
798+
r#"<paired attr1="value1" attr2="value2">
799+
<Foo attribute="attribute">
800+
<element>
801+
<baz>42</baz>
802+
<bat>43</bat>
803+
</element>
804+
<list>first element</list>
805+
<list>second element</list>
806+
text
807+
<val>foo</val>
808+
</Foo>
809+
</paired>"#
810+
);
811+
}
722812
}
723813
}

tests/serde-se.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -699,7 +699,7 @@ mod without_root {
699699
fn $name() {
700700
let mut buffer = String::new();
701701
let mut ser = Serializer::new(&mut buffer);
702-
ser.indent(' ', 2);
702+
ser.indent(' ', 2, 0);
703703

704704
$data.serialize(ser).unwrap();
705705
assert_eq!(buffer, $expected);

0 commit comments

Comments
 (0)