Skip to content

Commit 03e64d9

Browse files
committed
---
yaml --- r: 139372 b: refs/heads/try2 c: c9188c8 h: refs/heads/master v: v3
1 parent 6828c19 commit 03e64d9

File tree

2 files changed

+221
-34
lines changed

2 files changed

+221
-34
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ refs/heads/snap-stage3: 78a7676898d9f80ab540c6df5d4c9ce35bb50463
55
refs/heads/try: 519addf6277dbafccbb4159db4b710c37eaa2ec5
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
8-
refs/heads/try2: 6cf99fa54a51c728abf75f899f4f947673835268
8+
refs/heads/try2: c9188c83015e25978b9c6c4864040dd958bc54b1
99
refs/heads/dist-snap: ba4081a5a8573875fed17545846f6f6902c8ba8d
1010
refs/tags/release-0.2: c870d2dffb391e14efb05aa27898f1f6333a9596
1111
refs/tags/release-0.3: b5f0d0f648d9a6153664837026ba1be43d3e2503

branches/try2/src/libstd/json.rs

Lines changed: 220 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -140,9 +140,9 @@ impl serialize::Encoder for Encoder {
140140
// we'd have to change the expansion of auto-encode to pass
141141
// those along.
142142

143-
if (name == ~"Some") {
143+
if name == ~"Some" {
144144
f();
145-
} else if (name == ~"None") {
145+
} else if name == ~"None" {
146146
self.wr.write_str(~"null");
147147
} else {
148148
self.wr.write_char('[');
@@ -250,27 +250,57 @@ impl serialize::Encoder for PrettyEncoder {
250250
fn emit_owned(&self, f: &fn()) { f() }
251251
fn emit_managed(&self, f: &fn()) { f() }
252252

253-
fn emit_enum(&self, name: &str, f: &fn()) {
254-
if name != "option" { fail!(~"only supports option enum") }
255-
f()
256-
}
257-
fn emit_enum_variant(&self, _name: &str, id: uint, _cnt: uint, f: &fn()) {
258-
if id == 0 {
253+
fn emit_enum(&self, _name: &str, f: &fn()) { f() }
254+
fn emit_enum_variant(&self, name: &str, _id: uint, cnt: uint, f: &fn()) {
255+
if name == ~"Some" {
256+
f();
257+
} else if name == ~"None" {
259258
self.emit_nil();
260259
} else {
261-
f()
260+
self.wr.write_char('[');
261+
self.indent += 2;
262+
self.wr.write_char('\n');
263+
self.wr.write_str(spaces(self.indent));
264+
self.wr.write_str(escape_str(name));
265+
if cnt == 0 {
266+
self.wr.write_str(",\n");
267+
self.wr.write_str(spaces(self.indent));
268+
self.wr.write_str("[]\n");
269+
} else {
270+
self.wr.write_str(",\n");
271+
self.wr.write_str(spaces(self.indent));
272+
self.wr.write_str("[\n");
273+
self.indent += 2;
274+
f();
275+
self.wr.write_char('\n');
276+
self.indent -= 2;
277+
self.wr.write_str(spaces(self.indent));
278+
self.wr.write_str("]\n");
279+
}
280+
self.indent -= 2;
281+
self.wr.write_char(']');
262282
}
263283
}
264-
fn emit_enum_variant_arg(&self, _idx: uint, f: &fn()) {
284+
fn emit_enum_variant_arg(&self, idx: uint, f: &fn()) {
285+
if idx != 0 {
286+
self.wr.write_str(",\n");
287+
}
288+
self.wr.write_str(spaces(self.indent));
265289
f()
266290
}
267291

268-
fn emit_borrowed_vec(&self, _len: uint, f: &fn()) {
269-
self.wr.write_char('[');
270-
self.indent += 2;
271-
f();
272-
self.indent -= 2;
273-
self.wr.write_char(']');
292+
fn emit_borrowed_vec(&self, len: uint, f: &fn()) {
293+
if len == 0 {
294+
self.wr.write_str("[]");
295+
} else {
296+
self.wr.write_char('[');
297+
self.indent += 2;
298+
f();
299+
self.wr.write_char('\n');
300+
self.indent -= 2;
301+
self.wr.write_str(spaces(self.indent));
302+
self.wr.write_char(']');
303+
}
274304
}
275305
fn emit_owned_vec(&self, len: uint, f: &fn()) {
276306
self.emit_borrowed_vec(len, f)
@@ -292,11 +322,17 @@ impl serialize::Encoder for PrettyEncoder {
292322
self.wr.write_char('{');
293323
self.indent += 2;
294324
f();
325+
self.wr.write_char('\n');
295326
self.indent -= 2;
327+
self.wr.write_str(spaces(self.indent));
296328
self.wr.write_char('}');
297329
}
298-
fn emit_struct(&self, _name: &str, _len: uint, f: &fn()) {
299-
self.emit_rec(f)
330+
fn emit_struct(&self, _name: &str, len: uint, f: &fn()) {
331+
if len == 0 {
332+
self.wr.write_str("{}");
333+
} else {
334+
self.emit_rec(f)
335+
}
300336
}
301337
fn emit_field(&self, name: &str, idx: uint, f: &fn()) {
302338
if idx == 0 {
@@ -1248,13 +1284,97 @@ mod tests {
12481284
])), ~"[false,null,[\"foo\\nbar\",3.5]]");
12491285
}
12501286
1287+
#[test]
1288+
fn test_write_list_pretty() {
1289+
assert_eq!(to_pretty_str(&List(~[])), ~"[]");
1290+
assert_eq!(
1291+
to_pretty_str(&List(~[Boolean(true)])),
1292+
~"\
1293+
[\n \
1294+
true\n\
1295+
]"
1296+
);
1297+
assert_eq!(
1298+
to_pretty_str(&List(~[
1299+
Boolean(false),
1300+
Null,
1301+
List(~[String(~"foo\nbar"), Number(3.5f)])
1302+
])),
1303+
~"\
1304+
[\n \
1305+
false,\n \
1306+
null,\n \
1307+
[\n \
1308+
\"foo\\nbar\",\n \
1309+
3.5\n \
1310+
]\n\
1311+
]"
1312+
);
1313+
}
1314+
12511315
#[test]
12521316
fn test_write_object() {
12531317
assert_eq!(to_str(&mk_object(~[])), ~"{}");
12541318
assert_eq!(
12551319
to_str(&mk_object(~[(~"a", Boolean(true))])),
12561320
~"{\"a\":true}"
12571321
);
1322+
assert_eq!(
1323+
to_str(&mk_object(~[
1324+
(~"b", List(~[
1325+
mk_object(~[(~"c", String(~"\x0c\r"))]),
1326+
mk_object(~[(~"d", String(~""))])
1327+
]))
1328+
])),
1329+
~"{\
1330+
\"b\":[\
1331+
{\"c\":\"\\f\\r\"},\
1332+
{\"d\":\"\"}\
1333+
]\
1334+
}"
1335+
);
1336+
let a = mk_object(~[
1337+
(~"a", Boolean(true)),
1338+
(~"b", List(~[
1339+
mk_object(~[(~"c", String(~"\x0c\r"))]),
1340+
mk_object(~[(~"d", String(~""))])
1341+
]))
1342+
]);
1343+
// We can't compare the strings directly because the object fields be
1344+
// printed in a different order.
1345+
let b = from_str(to_str(&a)).unwrap();
1346+
assert_eq!(a, b);
1347+
}
1348+
1349+
#[test]
1350+
fn test_write_object_pretty() {
1351+
assert_eq!(to_pretty_str(&mk_object(~[])), ~"{\n}");
1352+
assert_eq!(
1353+
to_pretty_str(&mk_object(~[(~"a", Boolean(true))])),
1354+
~"\
1355+
{\n \
1356+
\"a\": true\n\
1357+
}"
1358+
);
1359+
assert_eq!(
1360+
to_pretty_str(&mk_object(~[
1361+
(~"b", List(~[
1362+
mk_object(~[(~"c", String(~"\x0c\r"))]),
1363+
mk_object(~[(~"d", String(~""))])
1364+
]))
1365+
])),
1366+
~"\
1367+
{\n \
1368+
\"b\": [\n \
1369+
{\n \
1370+
\"c\": \"\\f\\r\"\n \
1371+
},\n \
1372+
{\n \
1373+
\"d\": \"\"\n \
1374+
}\n \
1375+
]\n\
1376+
}"
1377+
);
12581378
let a = mk_object(~[
12591379
(~"a", Boolean(true)),
12601380
(~"b", List(~[
@@ -1268,24 +1388,71 @@ mod tests {
12681388
assert_eq!(a, b);
12691389
}
12701390
1391+
#[auto_encode]
1392+
enum Animal {
1393+
Dog,
1394+
Frog(~str, int)
1395+
}
1396+
12711397
#[test]
1272-
fn test_write_enum () {
1398+
fn test_write_enum_no_args() {
1399+
let animal = Dog;
1400+
12731401
let s = do io::with_str_writer |wr| {
1274-
let encoder = &Encoder(wr) as &serialize::Encoder;
1275-
do encoder.emit_enum(~"animal") {
1276-
do encoder.emit_enum_variant(~"frog",37,1242) {
1277-
// name of frog:
1278-
do encoder.emit_enum_variant_arg(0) {
1279-
encoder.emit_owned_str(~"Henry")
1280-
}
1281-
// mass of frog in grams:
1282-
do encoder.emit_enum_variant_arg(1) {
1283-
encoder.emit_int(349);
1284-
}
1285-
}
1286-
}
1402+
let encoder = Encoder(wr);
1403+
animal.encode(&encoder);
1404+
};
1405+
assert_eq!(s, ~"[\"Dog\",[]]");
1406+
}
1407+
1408+
#[test]
1409+
fn test_write_enum_no_args_pretty() {
1410+
let animal = Dog;
1411+
1412+
let s = do io::with_str_writer |wr| {
1413+
let encoder = PrettyEncoder(wr);
1414+
animal.encode(&encoder);
1415+
};
1416+
assert_eq!(
1417+
s,
1418+
~"\
1419+
[\n \
1420+
\"Dog\",\n \
1421+
[]\n\
1422+
]"
1423+
);
1424+
}
1425+
1426+
#[test]
1427+
fn test_write_enum_multiple_args() {
1428+
let animal = Frog(~"Henry", 349);
1429+
1430+
let s = do io::with_str_writer |wr| {
1431+
let encoder = Encoder(wr);
1432+
animal.encode(&encoder);
12871433
};
1288-
assert_eq!(s, ~"[\"frog\",[\"Henry\",349]]");
1434+
assert_eq!(s, ~"[\"Frog\",[\"Henry\",349]]");
1435+
}
1436+
1437+
#[test]
1438+
fn test_write_enum_multiple_args_pretty() {
1439+
let animal = Frog(~"Henry", 349);
1440+
1441+
let s = do io::with_str_writer |wr| {
1442+
let encoder = PrettyEncoder(wr);
1443+
animal.encode(&encoder);
1444+
};
1445+
assert_eq!(
1446+
s,
1447+
~"\
1448+
[\n \
1449+
\"Frog\",\n \
1450+
[\n \
1451+
\"Henry\",\n \
1452+
349\n \
1453+
]\n\
1454+
]"
1455+
);
12891456
}
12901457

12911458
#[test]
@@ -1298,6 +1465,16 @@ mod tests {
12981465
assert_eq!(s, ~"\"jodhpurs\"");
12991466
}
13001467

1468+
#[test]
1469+
fn test_write_some_pretty() {
1470+
let value = Some(~"jodhpurs");
1471+
let s = do io::with_str_writer |wr| {
1472+
let encoder = PrettyEncoder(wr);
1473+
value.encode(&encoder);
1474+
};
1475+
assert_eq!(s, ~"\"jodhpurs\"");
1476+
}
1477+
13011478
#[test]
13021479
fn test_write_none() {
13031480
let value: Option<~str> = None;
@@ -1308,6 +1485,16 @@ mod tests {
13081485
assert_eq!(s, ~"null");
13091486
}
13101487
1488+
#[test]
1489+
fn test_write_none_pretty() {
1490+
let value: Option<~str> = None;
1491+
let s = do io::with_str_writer |wr| {
1492+
let encoder = Encoder(wr);
1493+
value.encode(&encoder);
1494+
};
1495+
assert_eq!(s, ~"null");
1496+
}
1497+
13111498
#[test]
13121499
fn test_trailing_characters() {
13131500
assert_eq!(from_str(~"nulla"),

0 commit comments

Comments
 (0)