Skip to content

Commit

Permalink
Remove write_serializable_content from element writer
Browse files Browse the repository at this point in the history
  • Loading branch information
dralley committed Jun 18, 2023
1 parent d30e8b2 commit 1f80b16
Showing 1 changed file with 81 additions and 107 deletions.
188 changes: 81 additions & 107 deletions src/writer.rs
Original file line number Diff line number Diff line change
Expand Up @@ -271,13 +271,14 @@ impl<W: Write> Writer<W> {
pub fn write_serializable<T: Serialize>(
&mut self,
content: &T,
tag_override: Option<&str>,
) -> std::result::Result<(), DeError> {
use crate::se::Serializer;

self.write_indent()?;
let indent = self.indent.clone();
let mut fmt = ToFmtWrite(self.get_mut());
let mut serializer = Serializer::new(&mut fmt);
let mut serializer = Serializer::with_root(&mut fmt, tag_override)?;

if let Some(indent) = indent {
serializer.indent(
Expand Down Expand Up @@ -628,6 +629,85 @@ mod indentation {
);
}


#[cfg(feature = "serialize")]
#[test]
fn serializable() {
#[derive(Serialize)]
struct Foo {
#[serde(rename = "@attribute")]
attribute: &'static str,

element: Bar,
list: Vec<&'static str>,

#[serde(rename = "$text")]
text: &'static str,

val: String,
}

#[derive(Serialize)]
struct Bar {
baz: usize,
bat: usize,
}

let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);

let content = Foo {
attribute: "attribute",
element: Bar { baz: 42, bat: 43 },
list: vec!["first element", "second element"],
text: "text",
val: "foo".to_owned(),
};

let start = BytesStart::new("paired")
.with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter());
let end = start.to_end();

writer
.write_event(Event::Start(start.clone()))
.expect("write start tag failed");
writer
.write_serializable(&content, None)
.expect("write serializable inner contents failed");
writer
.write_serializable(&content, Some("customelement"))
.expect("write serializable inner contents failed");
writer
.write_event(Event::End(end))
.expect("write end tag failed");

assert_eq!(
std::str::from_utf8(&buffer).unwrap(),
r#"<paired attr1="value1" attr2="value2">
<Foo attribute="attribute">
<element>
<baz>42</baz>
<bat>43</bat>
</element>
<list>first element</list>
<list>second element</list>
text
<val>foo</val>
</Foo>
<customelement attribute="attribute">
<element>
<baz>42</baz>
<bat>43</bat>
</element>
<list>first element</list>
<list>second element</list>
text
<val>foo</val>
</customelement>
</paired>"#
);
}

#[test]
fn element_writer_empty() {
let mut buffer = Vec::new();
Expand Down Expand Up @@ -704,110 +784,4 @@ mod indentation {
</outer>"#
);
}

#[cfg(feature = "serialize")]
mod write_serializable {
use super::*;

#[derive(Serialize)]
struct Foo {
#[serde(rename = "@attribute")]
attribute: &'static str,

element: Bar,
list: Vec<&'static str>,

#[serde(rename = "$text")]
text: &'static str,

val: String,
}

#[derive(Serialize)]
struct Bar {
baz: usize,
bat: usize,
}

#[cfg(feature = "serialize")]
#[test]
fn serializable() {
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);

let content = Foo {
attribute: "attribute",
element: Bar { baz: 42, bat: 43 },
list: vec!["first element", "second element"],
text: "text",
val: "foo".to_owned(),
};

let start = BytesStart::new("paired")
.with_attributes(vec![("attr1", "value1"), ("attr2", "value2")].into_iter());
let end = start.to_end();

writer
.write_event(Event::Start(start.clone()))
.expect("write start tag failed");
writer
.write_serializable(&content)
.expect("write serializable inner contents failed");
writer
.write_event(Event::End(end))
.expect("write end tag failed");

assert_eq!(
std::str::from_utf8(&buffer).unwrap(),
r#"<paired attr1="value1" attr2="value2">
<Foo attribute="attribute">
<element>
<baz>42</baz>
<bat>43</bat>
</element>
<list>first element</list>
<list>second element</list>
text
<val>foo</val>
</Foo>
</paired>"#
);
}

#[test]
fn element_writer_serializable() {
let mut buffer = Vec::new();
let mut writer = Writer::new_with_indent(&mut buffer, b' ', 4);
let content = Foo {
attribute: "attribute",
element: Bar { baz: 42, bat: 43 },
list: vec!["first element", "second element"],
text: "text",
val: "foo".to_string(),
};

writer
.create_element("paired")
.with_attribute(("attr1", "value1"))
.with_attribute(("attr2", "value2"))
.write_serializable_content(&content)
.expect("failure");

assert_eq!(
std::str::from_utf8(&buffer).unwrap(),
r#"<paired attr1="value1" attr2="value2">
<Foo attribute="attribute">
<element>
<baz>42</baz>
<bat>43</bat>
</element>
<list>first element</list>
<list>second element</list>
text
<val>foo</val>
</Foo>
</paired>"#
);
}
}
}

0 comments on commit 1f80b16

Please sign in to comment.