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