@@ -401,6 +401,58 @@ rpc_encode_decode!(
401
401
}
402
402
) ;
403
403
404
+ macro_rules! mark_compound {
405
+ ( struct $name: ident <$( $T: ident) ,+> { $( $field: ident) ,* $( , ) ? } ) => {
406
+ impl <$( $T: Mark ) ,+> Mark for $name <$( $T) ,+> {
407
+ type Unmarked = $name <$( $T:: Unmarked ) ,+>;
408
+ fn mark( unmarked: Self :: Unmarked ) -> Self {
409
+ $name {
410
+ $( $field: Mark :: mark( unmarked. $field) ) ,*
411
+ }
412
+ }
413
+ }
414
+
415
+ impl <$( $T: Unmark ) ,+> Unmark for $name <$( $T) ,+> {
416
+ type Unmarked = $name <$( $T:: Unmarked ) ,+>;
417
+ fn unmark( self ) -> Self :: Unmarked {
418
+ $name {
419
+ $( $field: Unmark :: unmark( self . $field) ) ,*
420
+ }
421
+ }
422
+ }
423
+ } ;
424
+ ( enum $name: ident <$( $T: ident) ,+> { $( $variant: ident $( ( $field: ident) ) ?) ,* $( , ) ? } ) => {
425
+ impl <$( $T: Mark ) ,+> Mark for $name <$( $T) ,+> {
426
+ type Unmarked = $name <$( $T:: Unmarked ) ,+>;
427
+ fn mark( unmarked: Self :: Unmarked ) -> Self {
428
+ match unmarked {
429
+ $( $name:: $variant $( ( $field) ) ? => {
430
+ $name:: $variant $( ( Mark :: mark( $field) ) ) ?
431
+ } ) *
432
+ }
433
+ }
434
+ }
435
+
436
+ impl <$( $T: Unmark ) ,+> Unmark for $name <$( $T) ,+> {
437
+ type Unmarked = $name <$( $T:: Unmarked ) ,+>;
438
+ fn unmark( self ) -> Self :: Unmarked {
439
+ match self {
440
+ $( $name:: $variant $( ( $field) ) ? => {
441
+ $name:: $variant $( ( Unmark :: unmark( $field) ) ) ?
442
+ } ) *
443
+ }
444
+ }
445
+ }
446
+ }
447
+ }
448
+
449
+ macro_rules! compound_traits {
450
+ ( $( $t: tt) * ) => {
451
+ rpc_encode_decode!( $( $t) * ) ;
452
+ mark_compound!( $( $t) * ) ;
453
+ } ;
454
+ }
455
+
404
456
#[ derive( Clone ) ]
405
457
pub enum TokenTree < G , P , I , L > {
406
458
Group ( G ) ,
@@ -409,30 +461,7 @@ pub enum TokenTree<G, P, I, L> {
409
461
Literal ( L ) ,
410
462
}
411
463
412
- impl < G : Mark , P : Mark , I : Mark , L : Mark > Mark for TokenTree < G , P , I , L > {
413
- type Unmarked = TokenTree < G :: Unmarked , P :: Unmarked , I :: Unmarked , L :: Unmarked > ;
414
- fn mark ( unmarked : Self :: Unmarked ) -> Self {
415
- match unmarked {
416
- TokenTree :: Group ( tt) => TokenTree :: Group ( G :: mark ( tt) ) ,
417
- TokenTree :: Punct ( tt) => TokenTree :: Punct ( P :: mark ( tt) ) ,
418
- TokenTree :: Ident ( tt) => TokenTree :: Ident ( I :: mark ( tt) ) ,
419
- TokenTree :: Literal ( tt) => TokenTree :: Literal ( L :: mark ( tt) ) ,
420
- }
421
- }
422
- }
423
- impl < G : Unmark , P : Unmark , I : Unmark , L : Unmark > Unmark for TokenTree < G , P , I , L > {
424
- type Unmarked = TokenTree < G :: Unmarked , P :: Unmarked , I :: Unmarked , L :: Unmarked > ;
425
- fn unmark ( self ) -> Self :: Unmarked {
426
- match self {
427
- TokenTree :: Group ( tt) => TokenTree :: Group ( tt. unmark ( ) ) ,
428
- TokenTree :: Punct ( tt) => TokenTree :: Punct ( tt. unmark ( ) ) ,
429
- TokenTree :: Ident ( tt) => TokenTree :: Ident ( tt. unmark ( ) ) ,
430
- TokenTree :: Literal ( tt) => TokenTree :: Literal ( tt. unmark ( ) ) ,
431
- }
432
- }
433
- }
434
-
435
- rpc_encode_decode ! (
464
+ compound_traits ! (
436
465
enum TokenTree <G , P , I , L > {
437
466
Group ( tt) ,
438
467
Punct ( tt) ,
0 commit comments