@@ -409,6 +409,39 @@ rpc_encode_decode!(
409
409
}
410
410
) ;
411
411
412
+ macro_rules! mark_compound {
413
+ ( enum $name: ident <$( $T: ident) ,+> { $( $variant: 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
+ match unmarked {
418
+ $( $name:: $variant $( ( $field) ) ? => {
419
+ $name:: $variant $( ( Mark :: mark( $field) ) ) ?
420
+ } ) *
421
+ }
422
+ }
423
+ }
424
+
425
+ impl <$( $T: Unmark ) ,+> Unmark for $name <$( $T) ,+> {
426
+ type Unmarked = $name <$( $T:: Unmarked ) ,+>;
427
+ fn unmark( self ) -> Self :: Unmarked {
428
+ match self {
429
+ $( $name:: $variant $( ( $field) ) ? => {
430
+ $name:: $variant $( ( Unmark :: unmark( $field) ) ) ?
431
+ } ) *
432
+ }
433
+ }
434
+ }
435
+ }
436
+ }
437
+
438
+ macro_rules! compound_traits {
439
+ ( $( $t: tt) * ) => {
440
+ rpc_encode_decode!( $( $t) * ) ;
441
+ mark_compound!( $( $t) * ) ;
442
+ } ;
443
+ }
444
+
412
445
#[ derive( Clone ) ]
413
446
pub enum TokenTree < G , P , I , L > {
414
447
Group ( G ) ,
@@ -417,30 +450,7 @@ pub enum TokenTree<G, P, I, L> {
417
450
Literal ( L ) ,
418
451
}
419
452
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 ! (
453
+ compound_traits ! (
444
454
enum TokenTree <G , P , I , L > {
445
455
Group ( tt) ,
446
456
Punct ( tt) ,
0 commit comments