@@ -140,9 +140,9 @@ impl serialize::Encoder for Encoder {
140
140
// we'd have to change the expansion of auto-encode to pass
141
141
// those along.
142
142
143
- if ( name == ~"Some ") {
143
+ if name == ~"Some " {
144
144
f ( ) ;
145
- } else if ( name == ~"None ") {
145
+ } else if name == ~"None " {
146
146
self . wr . write_str ( ~"null") ;
147
147
} else {
148
148
self . wr . write_char ( '[' ) ;
@@ -250,27 +250,57 @@ impl serialize::Encoder for PrettyEncoder {
250
250
fn emit_owned ( & self , f : & fn ( ) ) { f ( ) }
251
251
fn emit_managed ( & self , f : & fn ( ) ) { f ( ) }
252
252
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 " {
259
258
self . emit_nil ( ) ;
260
259
} 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 ( ']' ) ;
262
282
}
263
283
}
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 ) ) ;
265
289
f ( )
266
290
}
267
291
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
+ }
274
304
}
275
305
fn emit_owned_vec ( & self , len : uint , f : & fn ( ) ) {
276
306
self . emit_borrowed_vec ( len, f)
@@ -292,11 +322,17 @@ impl serialize::Encoder for PrettyEncoder {
292
322
self . wr . write_char ( '{' ) ;
293
323
self . indent += 2 ;
294
324
f ( ) ;
325
+ self . wr . write_char ( '\n' ) ;
295
326
self . indent -= 2 ;
327
+ self . wr . write_str ( spaces ( self . indent ) ) ;
296
328
self . wr . write_char ( '}' ) ;
297
329
}
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
+ }
300
336
}
301
337
fn emit_field ( & self , name : & str , idx : uint , f : & fn ( ) ) {
302
338
if idx == 0 {
@@ -1248,13 +1284,97 @@ mod tests {
1248
1284
])), ~" [ false , null, [ \" foo\\ nbar\" , 3.5 ] ] ");
1249
1285
}
1250
1286
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\n bar"), 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
+
1251
1315
#[ test]
1252
1316
fn test_write_object( ) {
1253
1317
assert_eq!( to_str( & mk_object( ~[ ] ) ) , ~"{ } ");
1254
1318
assert_eq!(
1255
1319
to_str(&mk_object(~[(~" a", Boolean(true))])),
1256
1320
~" { \" a\" : true } "
1257
1321
);
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
+ ) ;
1258
1378
let a = mk_object( ~[
1259
1379
( ~"a", Boolean(true)),
1260
1380
(~" b", List(~[
@@ -1268,24 +1388,71 @@ mod tests {
1268
1388
assert_eq!(a, b);
1269
1389
}
1270
1390
1391
+ #[auto_encode]
1392
+ enum Animal {
1393
+ Dog,
1394
+ Frog(~str, int)
1395
+ }
1396
+
1271
1397
#[test]
1272
- fn test_write_enum () {
1398
+ fn test_write_enum_no_args() {
1399
+ let animal = Dog;
1400
+
1273
1401
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);
1287
1433
};
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
+ ) ;
1289
1456
}
1290
1457
1291
1458
#[ test]
@@ -1298,6 +1465,16 @@ mod tests {
1298
1465
assert_eq!(s, ~"\" jodhpurs\" " ) ;
1299
1466
}
1300
1467
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
+
1301
1478
#[ test]
1302
1479
fn test_write_none( ) {
1303
1480
let value: Option <~str > = None ;
@@ -1308,6 +1485,16 @@ mod tests {
1308
1485
assert_eq!( s, ~"null");
1309
1486
}
1310
1487
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
+
1311
1498
#[test]
1312
1499
fn test_trailing_characters() {
1313
1500
assert_eq!(from_str(~" nulla"),
0 commit comments