add pretty sting serialization
This commit is contained in:
parent
36a4ebd3bf
commit
fe894fee6c
37
src/ser.rs
37
src/ser.rs
|
@ -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,
|
fn display<T: fmt::Display>(&mut self,
|
||||||
t: T,
|
t: T,
|
||||||
type_: &'static str) -> Result<(), Error> {
|
type_: &'static str) -> Result<(), Error> {
|
||||||
|
@ -300,12 +316,27 @@ impl<'a> Serializer<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
fn emit_str(&mut self, value: &str) -> Result<(), Error> {
|
fn emit_str(&mut self, value: &str) -> Result<(), Error> {
|
||||||
|
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, "\""));
|
drop(write!(self.dst, "\""));
|
||||||
|
}
|
||||||
for ch in value.chars() {
|
for ch in value.chars() {
|
||||||
match ch {
|
match ch {
|
||||||
'\u{8}' => drop(write!(self.dst, "\\b")),
|
'\u{8}' => drop(write!(self.dst, "\\b")),
|
||||||
'\u{9}' => drop(write!(self.dst, "\\t")),
|
'\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{c}' => drop(write!(self.dst, "\\f")),
|
||||||
'\u{d}' => drop(write!(self.dst, "\\r")),
|
'\u{d}' => drop(write!(self.dst, "\\r")),
|
||||||
'\u{22}' => drop(write!(self.dst, "\\\"")),
|
'\u{22}' => drop(write!(self.dst, "\\\"")),
|
||||||
|
@ -316,7 +347,11 @@ impl<'a> Serializer<'a> {
|
||||||
ch => drop(write!(self.dst, "{}", ch)),
|
ch => drop(write!(self.dst, "{}", ch)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if do_pretty {
|
||||||
|
drop(write!(self.dst, "'''"));
|
||||||
|
} else {
|
||||||
drop(write!(self.dst, "\""));
|
drop(write!(self.dst, "\""));
|
||||||
|
}
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
20
tests/pretty.rs
Normal file
20
tests/pretty.rs
Normal file
|
@ -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);
|
||||||
|
}
|
Loading…
Reference in a new issue