std: change default json enum encoder to use strings or a flat vec
diff --git a/src/libstd/json.rs b/src/libstd/json.rs
index 3868b68..d69917c 100644
--- a/src/libstd/json.rs
+++ b/src/libstd/json.rs
@@ -119,22 +119,15 @@
f()
}
- fn emit_enum_variant(&self, name: &str, _id: uint, _cnt: uint, f: &fn()) {
+ fn emit_enum_variant(&self, name: &str, _id: uint, cnt: uint, f: &fn()) {
// encoding of enums is special-cased for Option. Specifically:
// Some(34) => 34
// None => null
- // other enums are encoded as vectors:
+ // other enums are encoded as strings or vectors:
+ // Bunny => "Bunny"
// Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
- // the default expansion for enums is more verbose than I'd like;
- // specifically, the inner pair of brackets seems superfluous,
- // BUT the design of the enumeration framework and the requirements
- // of the special-case for Option mean that a first argument must
- // be encoded "naked"--with no commas--and that the option name
- // can't be followed by just a comma, because there might not
- // be any elements in the tuple.
-
// FIXME #4872: this would be more precise and less frightening
// with fully-qualified option names. To get that information,
// we'd have to change the expansion of auto-encode to pass
@@ -144,14 +137,14 @@
f();
} else if name == ~"None" {
self.wr.write_str(~"null");
+ } else if cnt == 0 {
+ self.wr.write_str(escape_str(name));
} else {
self.wr.write_char('[');
self.wr.write_str(escape_str(name));
self.wr.write_char(',');
- self.wr.write_char('[');
f();
self.wr.write_char(']');
- self.wr.write_char(']');
}
}
@@ -256,28 +249,19 @@
f();
} else if name == ~"None" {
self.emit_nil();
+ } else if cnt == 0 {
+ self.wr.write_str(escape_str(name));
} else {
self.wr.write_char('[');
self.indent += 2;
self.wr.write_char('\n');
self.wr.write_str(spaces(self.indent));
self.wr.write_str(escape_str(name));
- if cnt == 0 {
- self.wr.write_str(",\n");
- self.wr.write_str(spaces(self.indent));
- self.wr.write_str("[]\n");
- } else {
- self.wr.write_str(",\n");
- self.wr.write_str(spaces(self.indent));
- self.wr.write_str("[\n");
- self.indent += 2;
- f();
- self.wr.write_char('\n');
- self.indent -= 2;
- self.wr.write_str(spaces(self.indent));
- self.wr.write_str("]\n");
- }
+ self.wr.write_str(",\n");
+ f();
+ self.wr.write_char('\n');
self.indent -= 2;
+ self.wr.write_str(spaces(self.indent));
self.wr.write_char(']');
}
}
@@ -1406,7 +1390,7 @@
let encoder = Encoder(wr);
animal.encode(&encoder);
};
- assert_eq!(s, ~"[\"Dog\",[]]");
+ assert_eq!(s, ~"\"Dog\"");
}
#[test]
@@ -1417,14 +1401,7 @@
let encoder = PrettyEncoder(wr);
animal.encode(&encoder);
};
- assert_eq!(
- s,
- ~"\
- [\n \
- \"Dog\",\n \
- []\n\
- ]"
- );
+ assert_eq!(s, ~"\"Dog\"");
}
#[test]
@@ -1435,7 +1412,7 @@
let encoder = Encoder(wr);
animal.encode(&encoder);
};
- assert_eq!(s, ~"[\"Frog\",[\"Henry\",349]]");
+ assert_eq!(s, ~"[\"Frog\",\"Henry\",349]");
}
#[test]
@@ -1451,10 +1428,8 @@
~"\
[\n \
\"Frog\",\n \
- [\n \
- \"Henry\",\n \
- 349\n \
- ]\n\
+ \"Henry\",\n \
+ 349\n\
]"
);
}