@@ -219,25 +219,36 @@ impl DeriveEnum {
219219 pub fn generate_decode ( self , generator : & mut Generator ) -> Result < ( ) > {
220220 let crate_name = self . attributes . crate_name . as_str ( ) ;
221221
222+ let decode_context = if let Some ( ( decode_context, _) ) = & self . attributes . decode_context {
223+ decode_context. as_str ( )
224+ } else {
225+ "__Context"
226+ } ;
222227 // Remember to keep this mostly in sync with generate_borrow_decode
223228
224229 let enum_name = generator. target_name ( ) . to_string ( ) ;
225230
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] )
228239 . modify_generic_constraints ( |generics, where_constraints| {
229240 if let Some ( ( bounds, lit) ) = ( self . attributes . decode_bounds . as_ref ( ) ) . or ( self . attributes . bounds . as_ref ( ) ) {
230241 where_constraints. clear ( ) ;
231242 where_constraints. push_parsed_constraint ( bounds) . map_err ( |e| e. with_span ( lit. span ( ) ) ) ?;
232243 } else {
233244 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) ) ?;
235246 }
236247 }
237248 Ok ( ( ) )
238249 } ) ?
239250 . 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 ) ] )
241252 . with_arg ( "decoder" , "&mut __D" )
242253 . with_return_type ( format ! ( "core::result::Result<Self, {}::error::DecodeError>" , crate_name) )
243254 . body ( |fn_builder| {
@@ -249,7 +260,7 @@ impl DeriveEnum {
249260 } else {
250261 fn_builder
251262 . push_parsed ( format ! (
252- "let variant_index = <u32 as {}::Decode>::decode(decoder)?;" ,
263+ "let variant_index = <u32 as {}::Decode::<__D::Context> >::decode(decoder)?;" ,
253264 crate_name
254265 ) ) ?;
255266 fn_builder. push_parsed ( "match variant_index" ) ?;
@@ -286,13 +297,13 @@ impl DeriveEnum {
286297 if attributes. with_serde {
287298 variant_body
288299 . 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," ,
290301 crate_name
291302 ) ) ?;
292303 } else {
293304 variant_body
294305 . push_parsed ( format ! (
295- "{}::Decode::decode(decoder)?," ,
306+ "{}::Decode::<__D::Context>:: decode(decoder)?," ,
296307 crate_name
297308 ) ) ?;
298309 }
@@ -318,17 +329,30 @@ impl DeriveEnum {
318329 pub fn generate_borrow_decode ( self , generator : & mut Generator ) -> Result < ( ) > {
319330 let crate_name = & self . attributes . crate_name ;
320331
332+ let decode_context = if let Some ( ( decode_context, _) ) = & self . attributes . decode_context {
333+ decode_context. as_str ( )
334+ } else {
335+ "__Context"
336+ } ;
337+
321338 // Remember to keep this mostly in sync with generate_decode
322339 let enum_name = generator. target_name ( ) . to_string ( ) ;
323340
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
325349 . modify_generic_constraints ( |generics, where_constraints| {
326350 if let Some ( ( bounds, lit) ) = ( self . attributes . borrow_decode_bounds . as_ref ( ) ) . or ( self . attributes . bounds . as_ref ( ) ) {
327351 where_constraints. clear ( ) ;
328352 where_constraints. push_parsed_constraint ( bounds) . map_err ( |e| e. with_span ( lit. span ( ) ) ) ?;
329353 } else {
330354 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 ( ) ;
332356 }
333357 for lt in generics. iter_lifetimes ( ) {
334358 where_constraints. push_parsed_constraint ( format ! ( "'__de: '{}" , lt. ident) ) ?;
@@ -337,7 +361,7 @@ impl DeriveEnum {
337361 Ok ( ( ) )
338362 } ) ?
339363 . 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 ) ] )
341365 . with_arg ( "decoder" , "&mut __D" )
342366 . with_return_type ( format ! ( "core::result::Result<Self, {}::error::DecodeError>" , crate_name) )
343367 . body ( |fn_builder| {
@@ -348,7 +372,7 @@ impl DeriveEnum {
348372 ) ) ?;
349373 } else {
350374 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) ) ?;
352376 fn_builder. push_parsed ( "match variant_index" ) ?;
353377 fn_builder. group ( Delimiter :: Brace , |variant_case| {
354378 for ( mut variant_index, variant) in self . iter_fields ( ) {
@@ -382,9 +406,9 @@ impl DeriveEnum {
382406 let attributes = field. attributes ( ) . get_attribute :: < FieldAttributes > ( ) ?. unwrap_or_default ( ) ;
383407 if attributes. with_serde {
384408 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) ) ?;
386410 } 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) ) ?;
388412 }
389413 }
390414 }
0 commit comments