aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/display.rs16
-rw-r--r--tests/formatting.rs52
2 files changed, 64 insertions, 4 deletions
diff --git a/src/display.rs b/src/display.rs
index 6891530..f563b77 100644
--- a/src/display.rs
+++ b/src/display.rs
@@ -57,6 +57,7 @@ fn write_str(f: &mut fmt::Formatter, s: &str) -> fmt::Result {
impl<'a, 'b> Printer<'a, 'b> {
fn print(&mut self, table: &'a TomlTable) -> fmt::Result {
+ let mut space_out_first = false;
for (k, v) in table.iter() {
match *v {
Table(..) => continue,
@@ -67,13 +68,17 @@ impl<'a, 'b> Printer<'a, 'b> {
}
_ => {}
}
+ space_out_first = true;
try!(writeln!(self.output, "{} = {}", Key(&[k]), v));
}
- for (k, v) in table.iter() {
+ for (i, (k, v)) in table.iter().enumerate() {
match *v {
Table(ref inner) => {
self.stack.push(k);
- try!(writeln!(self.output, "\n[{}]", Key(&self.stack)));
+ if space_out_first || i != 0 {
+ try!(write!(self.output, "\n"));
+ }
+ try!(writeln!(self.output, "[{}]", Key(&self.stack)));
try!(self.print(inner));
self.stack.pop();
}
@@ -83,8 +88,11 @@ impl<'a, 'b> Printer<'a, 'b> {
_ => continue
}
self.stack.push(k);
- for inner in inner.iter() {
- try!(writeln!(self.output, "\n[[{}]]", Key(&self.stack)));
+ for (j, inner) in inner.iter().enumerate() {
+ if space_out_first || i != 0 || j != 0 {
+ try!(write!(self.output, "\n"));
+ }
+ try!(writeln!(self.output, "[[{}]]", Key(&self.stack)));
match *inner {
Table(ref inner) => try!(self.print(inner)),
_ => panic!("non-heterogeneous toml array"),
diff --git a/tests/formatting.rs b/tests/formatting.rs
new file mode 100644
index 0000000..b8f4082
--- /dev/null
+++ b/tests/formatting.rs
@@ -0,0 +1,52 @@
+extern crate rustc_serialize;
+extern crate toml;
+use toml::encode_str;
+
+#[derive(Debug, Clone, Hash, PartialEq, Eq, RustcEncodable, RustcDecodable)]
+struct User {
+ pub name: String,
+ pub surname: String,
+}
+
+#[derive(Debug, Clone, Hash, PartialEq, Eq, RustcEncodable, RustcDecodable)]
+struct Users {
+ pub user: Vec<User>,
+}
+
+#[derive(Debug, Clone, Hash, PartialEq, Eq, RustcEncodable, RustcDecodable)]
+struct TwoUsers {
+ pub user0: User,
+ pub user1: User,
+}
+
+#[test]
+fn no_unnecessary_newlines_array() {
+ assert!(!encode_str(&Users {
+ user: vec![
+ User {
+ name: "John".to_string(),
+ surname: "Doe".to_string(),
+ },
+ User {
+ name: "Jane".to_string(),
+ surname: "Dough".to_string(),
+ },
+ ],
+ })
+ .starts_with("\n"));
+}
+
+#[test]
+fn no_unnecessary_newlines_table() {
+ assert!(!encode_str(&TwoUsers {
+ user0: User {
+ name: "John".to_string(),
+ surname: "Doe".to_string(),
+ },
+ user1: User {
+ name: "Jane".to_string(),
+ surname: "Dough".to_string(),
+ },
+ })
+ .starts_with("\n"));
+}