json_streaming/shared/
json_formatter.rs

1/// [JsonFormatter] controls how whitespace is added between JSON elements in the output. It does not
2///  affect the JSON's semantics, but only its looks and size.
3pub trait JsonFormatter {
4    /// optional whitespace after the ':' of a JSON object's key.
5    fn after_key(&self) -> &str;
6    /// optional newline after the start of an object or array; adds a level of nesting
7    fn after_start_nested(&mut self) -> &str;
8    /// optional newline after an element
9    fn after_element(&self) -> &str;
10    /// optional indent before then ending character of a nested object or array; removes a level of nesting
11    fn before_end_nested(&mut self, is_empty: bool) -> &str;
12    /// indentation, if any
13    fn indent(&self) -> &str;
14}
15
16/// Write a minimum of whitespace, minimizing output size
17pub struct CompactFormatter;
18impl JsonFormatter for CompactFormatter {
19    fn after_key(&self) -> &str { "" }
20    fn after_start_nested(&mut self) -> &str { "" }
21    fn after_element(&self) -> &str { "" }
22    fn before_end_nested(&mut self, _is_empty: bool) -> &str { "" }
23    fn indent(&self) -> &str { "" }
24}
25
26/// Write some whitespace and indentation to improve human readability
27pub struct PrettyFormatter {
28    indent_level: usize,
29}
30impl PrettyFormatter {
31    pub fn new() -> PrettyFormatter {
32        PrettyFormatter {
33            indent_level: 0,
34        }
35    }
36}
37impl JsonFormatter for PrettyFormatter {
38    fn after_key(&self) -> &str {
39        " "
40    }
41
42    fn after_start_nested(&mut self) -> &str {
43        self.indent_level += 1;
44        ""
45    }
46
47    fn after_element(&self) -> &str {
48        ""
49    }
50
51    fn before_end_nested(&mut self, is_empty: bool) -> &str {
52        self.indent_level -= 1;
53        if is_empty {
54            ""
55        }
56        else {
57            self.indent()
58        }
59    }
60
61    fn indent(&self) -> &str {
62        static INDENT: &'static str = "\n                                                                                                                                                                                                                                                 ";
63        &INDENT[..2*self.indent_level + 1]
64    }
65}