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