Various JSON pretty printing tweaks

This commit is contained in:
Kevin Cantu 2012-08-30 21:03:19 -07:00 committed by Erick Tryzelaar
parent 4fb675be2f
commit cf386188c8

View file

@ -102,14 +102,20 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
String(s) => wr.write_str(escape_str(*s)), String(s) => wr.write_str(escape_str(*s)),
Boolean(b) => wr.write_str(if b { ~"true" } else { ~"false" }), Boolean(b) => wr.write_str(if b { ~"true" } else { ~"false" }),
List(vv) => { List(vv) => {
if vv.len() == 0u {
wr.write_str(~"[]");
return;
}
let inner_indent = indent + 2;
// [ // [
wr.write_str(spaces(indent)); wr.write_str("[\n");
wr.write_str("[ "); wr.write_str(spaces(inner_indent));
// [ elem, // [ elem,
// elem, // elem,
// elem ] // elem ]
let inner_indent = indent + 2;
let mut first = true; let mut first = true;
for (*vv).each |item| { for (*vv).each |item| {
if !first { 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) => { Dict(dd) => {
if dd.size() == 0u {
wr.write_str(~"{}");
return;
}
let inner_indent = indent + 2;
// convert from a dictionary // convert from a dictionary
let mut pairs = ~[]; let mut pairs = ~[];
for dd.each |key, value| { 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); let sorted_pairs = sort::merge_sort(|a,b| *a <= *b, pairs);
// { // {
wr.write_str(spaces(indent)); wr.write_str(~"{\n");
wr.write_str(~"{ "); wr.write_str(spaces(inner_indent));
// { k: v, // { k: v,
// k: v, // k: v,
// k: v } // k: v }
let inner_indent = indent + 2;
let mut first = true; let mut first = true;
for sorted_pairs.each |kv| { for sorted_pairs.each |kv| {
let (key, value) = kv; let (key, value) = kv;
@ -150,13 +164,15 @@ fn to_writer_pretty(wr: io::Writer, j: Json, indent: uint) {
} }
first = false; first = false;
let key = str::append(escape_str(key), ~": "); 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); wr.write_str(key);
to_writer_pretty(wr, value, key_indent); 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") Null => wr.write_str(~"null")
} }
@ -892,6 +908,12 @@ mod tests {
assert from_str(~" \"foo\" ") == Ok(String(@~"foo")); assert from_str(~" \"foo\" ") == Ok(String(@~"foo"));
} }
#[test]
fn test_unicode_hex_escapes_in_str() {
assert from_str(~"\"\\u12ab\"") == Ok(String(@~"\u12ab"));
assert from_str(~"\"\\uAB12\"") == Ok(String(@~"\uAB12"));
}
#[test] #[test]
fn test_read_list() { fn test_read_list() {
assert from_str(~"[") == assert from_str(~"[") ==