3 use Table
as TomlTable
;
4 use Value
::{self, String, Integer, Float, Boolean, Datetime, Array, Table}
;
6 struct Printer
<'a
, 'b
:'a
> {
7 output
: &'a
mut fmt
::Formatter
<'b
>,
11 struct Key
<'a
>(&'a
[&'a
str]);
13 impl fmt
::Display
for Value
{
14 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
16 String(ref s
) => write_str(f
, s
),
17 Integer(i
) => write
!(f
, "{}", i
),
19 try
!(write
!(f
, "{}", fp
));
20 if fp
% 1.0 == 0.0 { try!(write!(f, ".0")) }
23 Boolean(b
) => write
!(f
, "{}", b
),
24 Datetime(ref s
) => write
!(f
, "{}", s
),
26 let mut p
= Printer { output: f, stack: Vec::new() }
;
31 for (i
, v
) in a
.iter().enumerate() {
32 if i
!= 0 { try!(write!(f, ", ")); }
33 try
!(write
!(f
, "{}", v
));
41 fn write_str(f
: &mut fmt
::Formatter
, s
: &str) -> fmt
::Result
{
42 try
!(write
!(f
, "\""));
45 '
\u{8}'
=> try
!(write
!(f
, "\\b")),
46 '
\u{9}'
=> try
!(write
!(f
, "\\t")),
47 '
\u{a}'
=> try
!(write
!(f
, "\\n")),
48 '
\u{c}'
=> try
!(write
!(f
, "\\f")),
49 '
\u{d}'
=> try
!(write
!(f
, "\\r")),
50 '
\u{22}'
=> try
!(write
!(f
, "\\\"")),
51 '
\u{5c}'
=> try
!(write
!(f
, "\\\\")),
52 ch
=> try
!(write
!(f
, "{}", ch
)),
58 impl<'a
, 'b
> Printer
<'a
, 'b
> {
59 fn print(&mut self, table
: &'a TomlTable
) -> fmt
::Result
{
60 for (k
, v
) in table
.iter() {
62 Table(..) => continue,
64 if let Some(&Table(..)) = a
.first() {
70 try
!(writeln
!(self.output
, "{} = {}", Key(&[k
]), v
));
72 for (k
, v
) in table
.iter() {
76 try
!(writeln
!(self.output
, "\n[{}]", Key(&self.stack
)));
77 try
!(self.print(inner
));
82 Some(&Table(..)) => {}
86 for inner
in inner
.iter() {
87 try
!(writeln
!(self.output
, "\n[[{}]]", Key(&self.stack
)));
89 Table(ref inner
) => try
!(self.print(inner
)),
90 _
=> panic
!("non-heterogeneous toml array"),
102 impl<'a
> fmt
::Display
for Key
<'a
> {
103 fn fmt(&self, f
: &mut fmt
::Formatter
) -> fmt
::Result
{
104 for (i
, part
) in self.0.iter
().enumerate() {
105 if i
!= 0 { try!(write!(f, ".")); }
106 let ok
= part
.chars().all(|c
| {
116 try
!(write
!(f
, "{}", part
));
118 try
!(write_str(f
, part
));
129 use Value
::{String, Integer, Float, Boolean, Datetime, Array, Table}
;
130 use std
::collections
::BTreeMap
;
132 macro_rules
! map( ($
($k
:expr
=> $v
:expr
),*) => ({
133 let mut _m
= BTreeMap
::new();
134 $
(_m
.insert($k
.to_string(), $v
);)*
140 assert_eq
!(String("foo".to_string()).to_string(),
142 assert_eq
!(Integer(10).to_string(),
144 assert_eq
!(Float(10.0).to_string(),
146 assert_eq
!(Float(2.4).to_string(),
148 assert_eq
!(Boolean(true).to_string(),
150 assert_eq
!(Datetime("test".to_string()).to_string(),
152 assert_eq
!(Array(vec
![]).to_string(),
154 assert_eq
!(Array(vec
![Integer(1), Integer(2)]).to_string(),
160 assert_eq
!(Table(map
! { }
).to_string(),
162 assert_eq
!(Table(map
! { "test" => Integer(2) }
).to_string(),
164 assert_eq
!(Table(map
! {
165 "test" => Integer(2),
166 "test2" => Table(map
! {
167 "test" => String("wut".to_string())
174 assert_eq
!(Table(map
! {
175 "test" => Integer(2),
176 "test2" => Table(map
! {
177 "test" => String("wut".to_string())
184 assert_eq
!(Table(map
! {
185 "test" => Integer(2),
186 "test2" => Array(vec
![Table(map
! {
187 "test" => String("wut".to_string())
194 assert_eq
!(Table(map
! {
195 "foo.bar" => Integer(2),
196 "foo\"bar" => Integer(2)
198 "\"foo\\\"bar\" = 2\n\