Skip to content

Commit 2f96c22

Browse files
committed
auto merge of #9231 : cmr/rust/enum_encoding, r=catamorphism
2 parents 38d4f48 + d0e0c33 commit 2f96c22

File tree

2 files changed

+146
-37
lines changed

2 files changed

+146
-37
lines changed

src/libextra/json.rs

+24-15
Original file line numberDiff line numberDiff line change
@@ -135,18 +135,21 @@ impl serialize::Encoder for Encoder {
135135
_id: uint,
136136
cnt: uint,
137137
f: &fn(&mut Encoder)) {
138-
// enums are encoded as strings or vectors:
138+
// enums are encoded as strings or objects
139139
// Bunny => "Bunny"
140-
// Kangaroo(34,"William") => ["Kangaroo",[34,"William"]]
141-
140+
// Kangaroo(34,"William") => {"variant": "Kangaroo", "fields": [34,"William"]}
142141
if cnt == 0 {
143142
self.wr.write_str(escape_str(name));
144143
} else {
145-
self.wr.write_char('[');
144+
self.wr.write_char('{');
145+
self.wr.write_str("\"variant\"");
146+
self.wr.write_char(':');
146147
self.wr.write_str(escape_str(name));
147148
self.wr.write_char(',');
149+
self.wr.write_str("\"fields\"");
150+
self.wr.write_str(":[");
148151
f(self);
149-
self.wr.write_char(']');
152+
self.wr.write_str("]}");
150153
}
151154
}
152155

@@ -947,14 +950,20 @@ impl serialize::Decoder for Decoder {
947950
debug!("read_enum_variant(names=%?)", names);
948951
let name = match self.stack.pop() {
949952
String(s) => s,
950-
List(list) => {
951-
for v in list.move_rev_iter() {
952-
self.stack.push(v);
953-
}
954-
match self.stack.pop() {
955-
String(s) => s,
956-
value => fail!("invalid variant name: %?", value),
953+
Object(o) => {
954+
let n = match o.find(&~"variant").expect("invalidly encoded json") {
955+
&String(ref s) => s.clone(),
956+
_ => fail!("invalidly encoded json"),
957+
};
958+
match o.find(&~"fields").expect("invalidly encoded json") {
959+
&List(ref l) => {
960+
for field in l.rev_iter() {
961+
self.stack.push(field.clone());
962+
}
963+
},
964+
_ => fail!("invalidly encoded json")
957965
}
966+
n
958967
}
959968
ref json => fail!("invalid variant: %?", *json),
960969
};
@@ -1517,7 +1526,7 @@ mod tests {
15171526
let mut encoder = Encoder(wr);
15181527
animal.encode(&mut encoder);
15191528
},
1520-
~"[\"Frog\",\"Henry\",349]"
1529+
~"{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}"
15211530
);
15221531
assert_eq!(
15231532
do io::with_str_writer |wr| {
@@ -1921,14 +1930,14 @@ mod tests {
19211930
assert_eq!(value, Dog);
19221931

19231932
let mut decoder =
1924-
Decoder(from_str("[\"Frog\",\"Henry\",349]").unwrap());
1933+
Decoder(from_str("{\"variant\":\"Frog\",\"fields\":[\"Henry\",349]}").unwrap());
19251934
let value: Animal = Decodable::decode(&mut decoder);
19261935
assert_eq!(value, Frog(~"Henry", 349));
19271936
}
19281937
19291938
#[test]
19301939
fn test_decode_map() {
1931-
let s = ~"{\"a\": \"Dog\", \"b\": [\"Frog\", \"Henry\", 349]}";
1940+
let s = ~"{\"a\": \"Dog\", \"b\": {\"variant\":\"Frog\",\"fields\":[\"Henry\", 349]}}";
19321941
let mut decoder = Decoder(from_str(s).unwrap());
19331942
let mut map: TreeMap<~str, Animal> = Decodable::decode(&mut decoder);
19341943

src/libsyntax/parse/mod.rs

+122-22
Original file line numberDiff line numberDiff line change
@@ -398,30 +398,130 @@ mod test {
398398
#[test] fn string_to_tts_1 () {
399399
let (tts,_ps) = string_to_tts_and_sess(@"fn a (b : int) { b; }");
400400
assert_eq!(to_json_str(@tts),
401-
~"[\
402-
[\"tt_tok\",null,[\"IDENT\",\"fn\",false]],\
403-
[\"tt_tok\",null,[\"IDENT\",\"a\",false]],\
404-
[\
405-
\"tt_delim\",\
406-
[\
407-
[\"tt_tok\",null,\"LPAREN\"],\
408-
[\"tt_tok\",null,[\"IDENT\",\"b\",false]],\
409-
[\"tt_tok\",null,\"COLON\"],\
410-
[\"tt_tok\",null,[\"IDENT\",\"int\",false]],\
411-
[\"tt_tok\",null,\"RPAREN\"]\
401+
~"[\
402+
{\
403+
\"variant\":\"tt_tok\",\
404+
\"fields\":[\
405+
null,\
406+
{\
407+
\"variant\":\"IDENT\",\
408+
\"fields\":[\
409+
\"fn\",\
410+
false\
411+
]\
412+
}\
413+
]\
414+
},\
415+
{\
416+
\"variant\":\"tt_tok\",\
417+
\"fields\":[\
418+
null,\
419+
{\
420+
\"variant\":\"IDENT\",\
421+
\"fields\":[\
422+
\"a\",\
423+
false\
424+
]\
425+
}\
426+
]\
427+
},\
428+
{\
429+
\"variant\":\"tt_delim\",\
430+
\"fields\":[\
431+
[\
432+
{\
433+
\"variant\":\"tt_tok\",\
434+
\"fields\":[\
435+
null,\
436+
\"LPAREN\"\
412437
]\
413-
],\
414-
[\
415-
\"tt_delim\",\
416-
[\
417-
[\"tt_tok\",null,\"LBRACE\"],\
418-
[\"tt_tok\",null,[\"IDENT\",\"b\",false]],\
419-
[\"tt_tok\",null,\"SEMI\"],\
420-
[\"tt_tok\",null,\"RBRACE\"]\
438+
},\
439+
{\
440+
\"variant\":\"tt_tok\",\
441+
\"fields\":[\
442+
null,\
443+
{\
444+
\"variant\":\"IDENT\",\
445+
\"fields\":[\
446+
\"b\",\
447+
false\
448+
]\
449+
}\
421450
]\
422-
]\
423-
]"
424-
);
451+
},\
452+
{\
453+
\"variant\":\"tt_tok\",\
454+
\"fields\":[\
455+
null,\
456+
\"COLON\"\
457+
]\
458+
},\
459+
{\
460+
\"variant\":\"tt_tok\",\
461+
\"fields\":[\
462+
null,\
463+
{\
464+
\"variant\":\"IDENT\",\
465+
\"fields\":[\
466+
\"int\",\
467+
false\
468+
]\
469+
}\
470+
]\
471+
},\
472+
{\
473+
\"variant\":\"tt_tok\",\
474+
\"fields\":[\
475+
null,\
476+
\"RPAREN\"\
477+
]\
478+
}\
479+
]\
480+
]\
481+
},\
482+
{\
483+
\"variant\":\"tt_delim\",\
484+
\"fields\":[\
485+
[\
486+
{\
487+
\"variant\":\"tt_tok\",\
488+
\"fields\":[\
489+
null,\
490+
\"LBRACE\"\
491+
]\
492+
},\
493+
{\
494+
\"variant\":\"tt_tok\",\
495+
\"fields\":[\
496+
null,\
497+
{\
498+
\"variant\":\"IDENT\",\
499+
\"fields\":[\
500+
\"b\",\
501+
false\
502+
]\
503+
}\
504+
]\
505+
},\
506+
{\
507+
\"variant\":\"tt_tok\",\
508+
\"fields\":[\
509+
null,\
510+
\"SEMI\"\
511+
]\
512+
},\
513+
{\
514+
\"variant\":\"tt_tok\",\
515+
\"fields\":[\
516+
null,\
517+
\"RBRACE\"\
518+
]\
519+
}\
520+
]\
521+
]\
522+
}\
523+
]"
524+
);
425525
}
426526
427527
#[test] fn ret_expr() {

0 commit comments

Comments
 (0)