@@ -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\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+
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