Skip to content

Commit 1f80b16

Browse files
committed
Remove write_serializable_content from element writer
1 parent d30e8b2 commit 1f80b16

File tree

1 file changed

+81
-107
lines changed

1 file changed

+81
-107
lines changed

src/writer.rs

+81-107
Original file line numberDiff line numberDiff line change
@@ -271,13 +271,14 @@ impl<W: Write> Writer<W> {
271271
pub fn write_serializable<T: Serialize>(
272272
&mut self,
273273
content: &T,
274+
tag_override: Option<&str>,
274275
) -> std::result::Result<(), DeError> {
275276
use crate::se::Serializer;
276277

277278
self.write_indent()?;
278279
let indent = self.indent.clone();
279280
let mut fmt = ToFmtWrite(self.get_mut());
280-
let mut serializer = Serializer::new(&mut fmt);
281+
let mut serializer = Serializer::with_root(&mut fmt, tag_override)?;
281282

282283
if let Some(indent) = indent {
283284
serializer.indent(
@@ -628,6 +629,85 @@ mod indentation {
628629
);
629630
}
630631

632+
633+
#[cfg(feature = "serialize")]
634+
#[test]
635+
fn serializable() {
636+
#[derive(Serialize)]
637+
struct Foo {
638+
#[serde(rename = "@attribute")]
639+
attribute: &'static str,
640+
641+
element: Bar,
642+
list: Vec<&'static str>,
643+
644+
#[serde(rename = "$text")]
645+
text: &'static str,
646+
647+
val: String,
648+
}
649+
650+
#[derive(Serialize)]
651+
struct Bar {
652+
baz: usize,
653+
bat: usize,
654+
}
655+
656+
let mut buffer = Vec::new();
657+
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
658+
659+
let content = Foo {
660+
attribute: "attribute",
661+
element: Bar { baz: 42, bat: 43 },
662+
list: vec!["first element", "second element"],
663+
text: "text",
664+
val: "foo".to_owned(),
665+
};
666+
667+
let start = BytesStart::new("paired")
668+
.with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter());
669+
let end = start.to_end();
670+
671+
writer
672+
.write_event(Event::Start(start.clone()))
673+
.expect("write start tag failed");
674+
writer
675+
.write_serializable(&content, None)
676+
.expect("write serializable inner contents failed");
677+
writer
678+
.write_serializable(&content, Some("customelement"))
679+
.expect("write serializable inner contents failed");
680+
writer
681+
.write_event(Event::End(end))
682+
.expect("write end tag failed");
683+
684+
assert_eq!(
685+
std::str::from_utf8(&buffer).unwrap(),
686+
r#"<paired attr1="value1" attr2="value2">
687+
<Foo attribute="attribute">
688+
<element>
689+
<baz>42</baz>
690+
<bat>43</bat>
691+
</element>
692+
<list>first element</list>
693+
<list>second element</list>
694+
text
695+
<val>foo</val>
696+
</Foo>
697+
<customelement attribute="attribute">
698+
<element>
699+
<baz>42</baz>
700+
<bat>43</bat>
701+
</element>
702+
<list>first element</list>
703+
<list>second element</list>
704+
text
705+
<val>foo</val>
706+
</customelement>
707+
</paired>"#
708+
);
709+
}
710+
631711
#[test]
632712
fn element_writer_empty() {
633713
let mut buffer = Vec::new();
@@ -704,110 +784,4 @@ mod indentation {
704784
</outer>"#
705785
);
706786
}
707-
708-
#[cfg(feature = "serialize")]
709-
mod write_serializable {
710-
use super::*;
711-
712-
#[derive(Serialize)]
713-
struct Foo {
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-
723-
val: String,
724-
}
725-
726-
#[derive(Serialize)]
727-
struct Bar {
728-
baz: usize,
729-
bat: usize,
730-
}
731-
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-
}
776-
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-
}
812-
}
813787
}

0 commit comments

Comments
 (0)