@@ -409,6 +409,58 @@ rpc_encode_decode!(
409409 }
410410) ;
411411
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+
412464#[ derive( Clone ) ]
413465pub enum TokenTree < G , P , I , L > {
414466 Group ( G ) ,
@@ -417,30 +469,7 @@ pub enum TokenTree<G, P, I, L> {
417469 Literal ( L ) ,
418470}
419471
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 ! (
444473 enum TokenTree <G , P , I , L > {
445474 Group ( tt) ,
446475 Punct ( tt) ,
0 commit comments