From 594b845b5a3399da62eaf80cbd00117bf74da910 Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Tue, 6 Sep 2016 09:00:35 +0200 Subject: [PATCH 1/2] Don't space out the first table or array if not needed Closes #110 --- src/display.rs | 16 ++++++++++++---- 1 file changed, 12 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"), From 1e575d420c2b5b8db9c4dcc86bd0649dea038efb Mon Sep 17 00:00:00 2001 From: nabijaczleweli Date: Tue, 6 Sep 2016 21:16:21 +0200 Subject: [PATCH 2/2] Add tests for checking for extraneous leading newlines (or lack thereof) Couldn't find a better place to put this (the "valid" and "invalid" tests are just for parser) so I made a new test module --- tests/formatting.rs | 52 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 tests/formatting.rs 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, +} + +#[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")); +}