about summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorKevin Cantu <me@kevincantu.org>2012-08-30 21:03:19 -0700
committerErick Tryzelaar <erick.tryzelaar@gmail.com>2012-08-31 07:11:07 -0700
commitcf386188c88c39902d4ef7f9a6be20379e288f5f (patch)
tree32672390e49cda528302b0a08960180406012e10 /src
parent4fb675be2f42a828fb5a6570b9aad2c65f4598b9 (diff)
Various JSON pretty printing tweaks
Diffstat (limited to 'src')
-rw-r--r--src/libstd/json.rs40
1 files changed, 31 insertions, 9 deletions
diff --git a/src/libstd/json.rs b/src/libstd/json.rs
index c8f15d47469..7c5a6187a57 100644
--- a/src/libstd/json.rs
+++ b/src/libstd/json.rs
@@ -102,14 +102,20 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
       String(s) => wr.write_str(escape_str(*s)),
       Boolean(b) => wr.write_str(if b { ~"true" } else { ~"false" }),
       List(vv) => {
+        if vv.len() == 0u {
+            wr.write_str(~"[]");
+            return;
+        }
+
+        let inner_indent = indent + 2;
+
         // [
-        wr.write_str(spaces(indent));
-        wr.write_str("[ ");
+        wr.write_str("[\n");
+        wr.write_str(spaces(inner_indent));
 
         // [ elem,
         //   elem,
         //   elem ]
-        let inner_indent = indent + 2;
         let mut first = true;
         for (*vv).each |item| {
             if !first {
@@ -121,9 +127,18 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
         };
 
         // ]
-        wr.write_str(~" ]");
+        wr.write_str("\n");
+        wr.write_str(spaces(indent));
+        wr.write_str(~"]");
       }
       Dict(dd) => {
+        if dd.size() == 0u {
+            wr.write_str(~"{}");
+            return;
+        }
+
+        let inner_indent = indent + 2;
+
         // convert from a dictionary
         let mut pairs = ~[];
         for dd.each |key, value| {
@@ -134,13 +149,12 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
         let sorted_pairs = sort::merge_sort(|a,b| *a <= *b, pairs);
 
         // {
-        wr.write_str(spaces(indent));
-        wr.write_str(~"{ ");
+        wr.write_str(~"{\n");
+        wr.write_str(spaces(inner_indent));
 
         // { k: v,
         //   k: v,
         //   k: v }
-        let inner_indent = indent + 2;
         let mut first = true;
         for sorted_pairs.each |kv| {
             let (key, value) = kv;
@@ -150,13 +164,15 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
             }
             first = false;
             let key = str::append(escape_str(key), ~": ");
-            let key_indent = str::len(key);
+            let key_indent = inner_indent + str::len(key);
             wr.write_str(key);
             to_writer_pretty(wr, value, key_indent);
         };
 
         // }
-        wr.write_str(~" }");
+        wr.write_str(~"\n");
+        wr.write_str(spaces(indent));
+        wr.write_str(~"}");
       }
       Null => wr.write_str(~"null")
     }
@@ -893,6 +909,12 @@ mod tests {
     }
 
     #[test]
+    fn test_unicode_hex_escapes_in_str() {
+        assert from_str(~"\"\\u12ab\"") == Ok(String(@~"\u12ab"));
+        assert from_str(~"\"\\uAB12\"") == Ok(String(@~"\uAB12"));
+    }
+
+    #[test]
     fn test_read_list() {
         assert from_str(~"[") ==
             Err({line: 1u, col: 2u, msg: @~"EOF while parsing value"});