@@ -219,25 +219,37 @@ impl DeriveEnum {
219
219
pub fn generate_decode ( self , generator : & mut Generator ) -> Result < ( ) > {
220
220
let crate_name = self . attributes . crate_name . as_str ( ) ;
221
221
222
+ let decode_context = if let Some ( ( decode_context, _) ) = & self . attributes . decode_context {
223
+ decode_context. as_str ( )
224
+ } else {
225
+ "__Ctx"
226
+ } ;
222
227
// Remember to keep this mostly in sync with generate_borrow_decode
223
228
224
229
let enum_name = generator. target_name ( ) . to_string ( ) ;
225
230
226
- generator
227
- . impl_for ( format ! ( "{}::Decode" , crate_name) )
231
+ let mut impl_for = generator. impl_for ( format ! ( "{}::Decode" , crate_name) ) ;
232
+
233
+
234
+ if self . attributes . decode_context . is_none ( ) {
235
+ impl_for = impl_for. with_impl_generics ( [ "__Ctx" ] ) ;
236
+ }
237
+
238
+ impl_for
239
+ . with_trait_generics ( [ decode_context] )
228
240
. modify_generic_constraints ( |generics, where_constraints| {
229
241
if let Some ( ( bounds, lit) ) = ( self . attributes . decode_bounds . as_ref ( ) ) . or ( self . attributes . bounds . as_ref ( ) ) {
230
242
where_constraints. clear ( ) ;
231
243
where_constraints. push_parsed_constraint ( bounds) . map_err ( |e| e. with_span ( lit. span ( ) ) ) ?;
232
244
} else {
233
245
for g in generics. iter_generics ( ) {
234
- where_constraints. push_constraint ( g, format ! ( "{}::Decode" , crate_name) ) ?;
246
+ where_constraints. push_constraint ( g, format ! ( "{}::Decode<__Ctx> " , crate_name) ) ?;
235
247
}
236
248
}
237
249
Ok ( ( ) )
238
250
} ) ?
239
251
. generate_fn ( "decode" )
240
- . with_generic_deps ( "__D" , [ format ! ( "{}::de::Decoder" , crate_name) ] )
252
+ . with_generic_deps ( "__D" , [ format ! ( "{}::de::Decoder<Ctx = {}> " , crate_name, decode_context ) ] )
241
253
. with_arg ( "decoder" , "&mut __D" )
242
254
. with_return_type ( format ! ( "core::result::Result<Self, {}::error::DecodeError>" , crate_name) )
243
255
. body ( |fn_builder| {
@@ -249,7 +261,7 @@ impl DeriveEnum {
249
261
} else {
250
262
fn_builder
251
263
. push_parsed ( format ! (
252
- "let variant_index = <u32 as {}::Decode>::decode(decoder)?;" ,
264
+ "let variant_index = <u32 as {}::Decode::<__D::Ctx> >::decode(decoder)?;" ,
253
265
crate_name
254
266
) ) ?;
255
267
fn_builder. push_parsed ( "match variant_index" ) ?;
@@ -286,13 +298,13 @@ impl DeriveEnum {
286
298
if attributes. with_serde {
287
299
variant_body
288
300
. push_parsed ( format ! (
289
- "<{0}::serde::Compat<_> as {0}::Decode>::decode(decoder)?.0," ,
301
+ "<{0}::serde::Compat<_> as {0}::Decode::<__D::Ctx> >::decode(decoder)?.0," ,
290
302
crate_name
291
303
) ) ?;
292
304
} else {
293
305
variant_body
294
306
. push_parsed ( format ! (
295
- "{}::Decode::decode(decoder)?," ,
307
+ "{}::Decode::<__D::Ctx>:: decode(decoder)?," ,
296
308
crate_name
297
309
) ) ?;
298
310
}
@@ -318,17 +330,30 @@ impl DeriveEnum {
318
330
pub fn generate_borrow_decode ( self , generator : & mut Generator ) -> Result < ( ) > {
319
331
let crate_name = & self . attributes . crate_name ;
320
332
333
+ let decode_context = if let Some ( ( decode_context, _) ) = & self . attributes . decode_context {
334
+ decode_context. as_str ( )
335
+ } else {
336
+ "__Ctx"
337
+ } ;
338
+
321
339
// Remember to keep this mostly in sync with generate_decode
322
340
let enum_name = generator. target_name ( ) . to_string ( ) ;
323
341
324
- generator. impl_for_with_lifetimes ( format ! ( "{}::BorrowDecode" , crate_name) , [ "__de" ] )
342
+ let mut impl_for = generator
343
+ . impl_for_with_lifetimes ( format ! ( "{}::BorrowDecode" , crate_name) , [ "__de" ] )
344
+ . with_trait_generics ( [ decode_context] ) ;
345
+ if self . attributes . decode_context . is_none ( ) {
346
+ impl_for = impl_for. with_impl_generics ( [ "__Ctx" ] ) ;
347
+ }
348
+
349
+ impl_for
325
350
. modify_generic_constraints ( |generics, where_constraints| {
326
351
if let Some ( ( bounds, lit) ) = ( self . attributes . borrow_decode_bounds . as_ref ( ) ) . or ( self . attributes . bounds . as_ref ( ) ) {
327
352
where_constraints. clear ( ) ;
328
353
where_constraints. push_parsed_constraint ( bounds) . map_err ( |e| e. with_span ( lit. span ( ) ) ) ?;
329
354
} else {
330
355
for g in generics. iter_generics ( ) {
331
- where_constraints. push_constraint ( g, format ! ( "{}::de::BorrowDecode<'__de>" , crate_name) ) . unwrap ( ) ;
356
+ where_constraints. push_constraint ( g, format ! ( "{}::de::BorrowDecode<'__de, {} >" , crate_name, decode_context ) ) . unwrap ( ) ;
332
357
}
333
358
for lt in generics. iter_lifetimes ( ) {
334
359
where_constraints. push_parsed_constraint ( format ! ( "'__de: '{}" , lt. ident) ) ?;
@@ -337,7 +362,7 @@ impl DeriveEnum {
337
362
Ok ( ( ) )
338
363
} ) ?
339
364
. generate_fn ( "borrow_decode" )
340
- . with_generic_deps ( "__D" , [ format ! ( "{}::de::BorrowDecoder<'__de>" , crate_name) ] )
365
+ . with_generic_deps ( "__D" , [ format ! ( "{}::de::BorrowDecoder<'__de, Ctx = {} >" , crate_name, decode_context ) ] )
341
366
. with_arg ( "decoder" , "&mut __D" )
342
367
. with_return_type ( format ! ( "core::result::Result<Self, {}::error::DecodeError>" , crate_name) )
343
368
. body ( |fn_builder| {
@@ -348,7 +373,7 @@ impl DeriveEnum {
348
373
) ) ?;
349
374
} else {
350
375
fn_builder
351
- . push_parsed ( format ! ( "let variant_index = <u32 as {}::Decode>::decode(decoder)?;" , crate_name) ) ?;
376
+ . push_parsed ( format ! ( "let variant_index = <u32 as {}::Decode::<__D::Ctx> >::decode(decoder)?;" , crate_name) ) ?;
352
377
fn_builder. push_parsed ( "match variant_index" ) ?;
353
378
fn_builder. group ( Delimiter :: Brace , |variant_case| {
354
379
for ( mut variant_index, variant) in self . iter_fields ( ) {
@@ -382,9 +407,9 @@ impl DeriveEnum {
382
407
let attributes = field. attributes ( ) . get_attribute :: < FieldAttributes > ( ) ?. unwrap_or_default ( ) ;
383
408
if attributes. with_serde {
384
409
variant_body
385
- . push_parsed ( format ! ( "<{0}::serde::BorrowCompat<_> as {0}::BorrowDecode>::borrow_decode(decoder)?.0," , crate_name) ) ?;
410
+ . push_parsed ( format ! ( "<{0}::serde::BorrowCompat<_> as {0}::BorrowDecode::<__D::Ctx> >::borrow_decode(decoder)?.0," , crate_name) ) ?;
386
411
} else {
387
- variant_body. push_parsed ( format ! ( "{}::BorrowDecode::borrow_decode(decoder)?," , crate_name) ) ?;
412
+ variant_body. push_parsed ( format ! ( "{}::BorrowDecode::<__D::Ctx>:: borrow_decode(decoder)?," , crate_name) ) ?;
388
413
}
389
414
}
390
415
}
0 commit comments