@@ -409,6 +409,39 @@ rpc_encode_decode!(
409409 }
410410) ;
411411
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+
412445#[ derive( Clone ) ]
413446pub enum TokenTree < G , P , I , L > {
414447 Group ( G ) ,
@@ -417,30 +450,7 @@ pub enum TokenTree<G, P, I, L> {
417450 Literal ( L ) ,
418451}
419452
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 ! (
444454 enum TokenTree <G , P , I , L > {
445455 Group ( tt) ,
446456 Punct ( tt) ,
0 commit comments