@@ -23,23 +23,23 @@ For example, a type like:
23
23
24
24
would generate two implementations like:
25
25
26
- impl<S: Encoder> node_id: Encodable<S> {
27
- fn encode(s: &S) {
28
- do s.emit_struct("Node", 1) {
29
- s.emit_field("id", 0, || s.emit_uint(self))
30
- }
26
+ impl<S: std::serialize::Encoder> Node: Encodable<S> {
27
+ fn encode(&self, s: &S) {
28
+ do s.emit_struct("Node", 1) {
29
+ s.emit_field("id", 0, || s.emit_uint(self.id))
31
30
}
32
31
}
32
+ }
33
33
34
- impl<D: Decoder> node_id: Decodable {
35
- static fn decode(d: &D) -> Node {
36
- do d.read_struct("Node", 1) {
37
- Node {
38
- id: d.read_field(~"x", 0, || decode(d))
39
- }
34
+ impl<D: Decoder> node_id: Decodable {
35
+ static fn decode(d: &D) -> Node {
36
+ do d.read_struct("Node", 1) {
37
+ Node {
38
+ id: d.read_field(~"x", 0, || decode(d))
40
39
}
41
40
}
42
41
}
42
+ }
43
43
44
44
Other interesting scenarios are whe the item has type parameters or
45
45
references other non-built-in types. A type definition like:
@@ -1150,3 +1150,154 @@ fn mk_enum_deser_body(
1150
1150
]
1151
1151
)
1152
1152
}
1153
+
1154
+
1155
+ #[cfg(test)]
1156
+ mod test {
1157
+ use std::serialize::Encodable;
1158
+ use std::serialize::Encoder;
1159
+ use core::dvec::*;
1160
+ use util::testing::*;
1161
+ use core::io;
1162
+ use core::str;
1163
+ use core::option::Option;
1164
+ use core::option::Some;
1165
+ use core::option::None;
1166
+ use std;
1167
+
1168
+ // just adding the ones I want to test, for now:
1169
+ #[deriving_eq]
1170
+ pub enum call {
1171
+ CallToEmitEnum(~str),
1172
+ CallToEmitEnumVariant(~str, uint, uint),
1173
+ CallToEmitEnumVariantArg(uint),
1174
+ CallToEmitUint(uint),
1175
+ CallToEmitNil,
1176
+ // all of the ones I was too lazy to handle:
1177
+ CallToOther
1178
+ }
1179
+ // using a mutable field rather than changing the
1180
+ // type of self in every method of every encoder everywhere.
1181
+ pub struct TestEncoder {mut call_log : ~[call]}
1182
+
1183
+ pub impl TestEncoder {
1184
+ // these self's should be &mut self's, as well....
1185
+ fn add_to_log (&self, c : call) {
1186
+ self.call_log.push(copy c);
1187
+ }
1188
+ fn add_unknown_to_log (&self) {
1189
+ self.add_to_log (CallToOther)
1190
+ }
1191
+ }
1192
+
1193
+ pub impl Encoder for TestEncoder {
1194
+ fn emit_nil(&self) { self.add_to_log(CallToEmitNil) }
1195
+
1196
+ fn emit_uint(&self, +v: uint) {self.add_to_log(CallToEmitUint(v)); }
1197
+ fn emit_u64(&self, +_v: u64) { self.add_unknown_to_log(); }
1198
+ fn emit_u32(&self, +_v: u32) { self.add_unknown_to_log(); }
1199
+ fn emit_u16(&self, +_v: u16) { self.add_unknown_to_log(); }
1200
+ fn emit_u8(&self, +_v: u8) { self.add_unknown_to_log(); }
1201
+
1202
+ fn emit_int(&self, +_v: int) { self.add_unknown_to_log(); }
1203
+ fn emit_i64(&self, +_v: i64) { self.add_unknown_to_log(); }
1204
+ fn emit_i32(&self, +_v: i32) { self.add_unknown_to_log(); }
1205
+ fn emit_i16(&self, +_v: i16) { self.add_unknown_to_log(); }
1206
+ fn emit_i8(&self, +_v: i8) { self.add_unknown_to_log(); }
1207
+
1208
+ fn emit_bool(&self, +_v: bool) { self.add_unknown_to_log(); }
1209
+
1210
+ fn emit_f64(&self, +_v: f64) { self.add_unknown_to_log(); }
1211
+ fn emit_f32(&self, +_v: f32) { self.add_unknown_to_log(); }
1212
+ fn emit_float(&self, +_v: float) { self.add_unknown_to_log(); }
1213
+
1214
+ fn emit_char(&self, +_v: char) { self.add_unknown_to_log(); }
1215
+
1216
+ fn emit_borrowed_str(&self, +_v: &str) { self.add_unknown_to_log(); }
1217
+ fn emit_owned_str(&self, +_v: &str) { self.add_unknown_to_log(); }
1218
+ fn emit_managed_str(&self, +_v: &str) { self.add_unknown_to_log(); }
1219
+
1220
+ fn emit_borrowed(&self, f: fn()) { self.add_unknown_to_log(); f() }
1221
+ fn emit_owned(&self, f: fn()) { self.add_unknown_to_log(); f() }
1222
+ fn emit_managed(&self, f: fn()) { self.add_unknown_to_log(); f() }
1223
+
1224
+ fn emit_enum(&self, name: &str, f: fn()) {
1225
+ self.add_to_log(CallToEmitEnum(name.to_str())); f(); }
1226
+
1227
+ fn emit_enum_variant(&self, name: &str, +id: uint,
1228
+ +cnt: uint, f: fn()) {
1229
+ self.add_to_log(CallToEmitEnumVariant (name.to_str(),id,cnt));
1230
+ f();
1231
+ }
1232
+
1233
+ fn emit_enum_variant_arg(&self, +idx: uint, f: fn()) {
1234
+ self.add_to_log(CallToEmitEnumVariantArg (idx)); f();
1235
+ }
1236
+
1237
+ fn emit_borrowed_vec(&self, +_len: uint, f: fn()) {
1238
+ self.add_unknown_to_log(); f();
1239
+ }
1240
+
1241
+ fn emit_owned_vec(&self, +_len: uint, f: fn()) {
1242
+ self.add_unknown_to_log(); f();
1243
+ }
1244
+ fn emit_managed_vec(&self, +_len: uint, f: fn()) {
1245
+ self.add_unknown_to_log(); f();
1246
+ }
1247
+ fn emit_vec_elt(&self, +_idx: uint, f: fn()) {
1248
+ self.add_unknown_to_log(); f();
1249
+ }
1250
+
1251
+ fn emit_rec(&self, f: fn()) {
1252
+ self.add_unknown_to_log(); f();
1253
+ }
1254
+ fn emit_struct(&self, _name: &str, +_len: uint, f: fn()) {
1255
+ self.add_unknown_to_log(); f();
1256
+ }
1257
+ fn emit_field(&self, _name: &str, +_idx: uint, f: fn()) {
1258
+ self.add_unknown_to_log(); f();
1259
+ }
1260
+
1261
+ fn emit_tup(&self, +_len: uint, f: fn()) {
1262
+ self.add_unknown_to_log(); f();
1263
+ }
1264
+ fn emit_tup_elt(&self, +_idx: uint, f: fn()) {
1265
+ self.add_unknown_to_log(); f();
1266
+ }
1267
+ }
1268
+
1269
+
1270
+ #[auto_decode]
1271
+ #[auto_encode]
1272
+ struct Node {id: uint}
1273
+
1274
+ fn to_call_log (val: Encodable<TestEncoder>) -> ~[call] {
1275
+ let mut te = TestEncoder {call_log: ~[]};
1276
+ val.encode(&te);
1277
+ te.call_log
1278
+ }
1279
+ /*
1280
+ #[test] fn encode_test () {
1281
+ check_equal (to_call_log(Node{id:34}
1282
+ as Encodable::<std::json::Encoder>),
1283
+ ~[CallToEnum (~" Node "),
1284
+ CallToEnumVariant]);
1285
+ }
1286
+ */
1287
+ #[auto_encode]
1288
+ enum Written {
1289
+ Book(uint,uint),
1290
+ Magazine(~str)
1291
+ }
1292
+
1293
+ #[test] fn encode_enum_test () {
1294
+ check_equal (to_call_log(Book(34,44)
1295
+ as Encodable::<TestEncoder>),
1296
+ ~[CallToEmitEnum (~" Written "),
1297
+ CallToEmitEnumVariant (~" Book " , 0 , 2 ) ,
1298
+ CallToEmitEnumVariantArg ( 0 ) ,
1299
+ CallToEmitUint ( 34 ) ,
1300
+ CallToEmitEnumVariantArg ( 1 ) ,
1301
+ CallToEmitUint ( 44 ) ] ) ;
1302
+ }
1303
+ }
0 commit comments