diff options
author | Garrett Berg <vitiral@gmail.com> | 2017-07-09 14:58:48 -0600 |
---|---|---|
committer | Garrett Berg <vitiral@gmail.com> | 2017-07-09 14:58:48 -0600 |
commit | 391cb61dffd51322bd310be7cba8641fe3398c19 (patch) | |
tree | 2c198e0504159af8f2cbe7cdb123e9f69bfb5122 | |
parent | 3c5a9486cb84c0076ee12b7d40372f819a54ac05 (diff) | |
download | milf-rs-391cb61dffd51322bd310be7cba8641fe3398c19.tar.gz milf-rs-391cb61dffd51322bd310be7cba8641fe3398c19.zip |
add pretty sting serialization
-rw-r--r-- | src/ser.rs | 41 | ||||
-rw-r--r-- | tests/pretty.rs | 20 |
2 files changed, 58 insertions, 3 deletions
@@ -214,6 +214,22 @@ impl<'a> Serializer<'a> { } } + /// instantiate a "pretty" formatter + /// + /// TODO: add better docs + pub fn pretty(dst: &'a mut String) -> Serializer<'a> { + Serializer { + dst: dst, + state: State::End, + settings: Settings { + array: Some(ArraySettings { + indent: 4, + }), + pretty_string: true, + }, + } + } + fn display<T: fmt::Display>(&mut self, t: T, type_: &'static str) -> Result<(), Error> { @@ -300,12 +316,27 @@ impl<'a> Serializer<'a> { } fn emit_str(&mut self, value: &str) -> Result<(), Error> { - drop(write!(self.dst, "\"")); + let do_pretty = if self.settings.pretty_string { + value.contains('\n') + } else { + false + }; + if do_pretty { + drop(write!(self.dst, "'''\n")); + } else { + drop(write!(self.dst, "\"")); + } for ch in value.chars() { match ch { '\u{8}' => drop(write!(self.dst, "\\b")), '\u{9}' => drop(write!(self.dst, "\\t")), - '\u{a}' => drop(write!(self.dst, "\\n")), + '\u{a}' => { + if do_pretty { + drop(write!(self.dst, "\n")); + } else { + drop(write!(self.dst, "\\n")); + } + }, '\u{c}' => drop(write!(self.dst, "\\f")), '\u{d}' => drop(write!(self.dst, "\\r")), '\u{22}' => drop(write!(self.dst, "\\\"")), @@ -316,7 +347,11 @@ impl<'a> Serializer<'a> { ch => drop(write!(self.dst, "{}", ch)), } } - drop(write!(self.dst, "\"")); + if do_pretty { + drop(write!(self.dst, "'''")); + } else { + drop(write!(self.dst, "\"")); + } Ok(()) } diff --git a/tests/pretty.rs b/tests/pretty.rs new file mode 100644 index 0000000..71c9e63 --- /dev/null +++ b/tests/pretty.rs @@ -0,0 +1,20 @@ +extern crate toml; +extern crate serde; + +use serde::ser::Serialize; + +const example: &str = "\ +[example] +text = ''' +this is the first line +this is the second line +''' +"; + +#[test] +fn test_pretty() { + let value: toml::Value = toml::from_str(example).unwrap(); + let mut result = String::with_capacity(128); + value.serialize(&mut toml::Serializer::pretty(&mut result)).unwrap(); + assert_eq!(example, &result); +} |