rules_derive 0.3.0

simple and fast derive macros using macro_rules
Documentation
use rules_derive::rules_derive;

macro_rules! Clone {
  (
    ($( ($($attr:tt)*) )*)
    $vis:vis $tystyle:ident $name:ident (($ty:ty) ($($generics_bindings:tt)*) ($($generics_inner:tt)*) where ($($generics_where:tt)*)) {
      $(
        $variant_name:ident ($variant_style:ident $($qualified_variant:tt)*) $(= ($discriminant:expr))? {
          $(
            $fieldvis:vis $fieldnameident:ident @ $fieldname:tt : $fieldty:ty,
          )*
        }
      )*
    }
  ) => {
    ::rules_derive::with_spans! {
      impl $($generics_bindings)* ::std::clone::Clone for $ty where
        $($generics_where)*
        $(
          $(
            spanned!($fieldty => $fieldty: ::std::clone::Clone,)
          )*
        )*
      {
        #[inline]
        fn clone(&self) -> Self {
          match self {
            $(
              $($qualified_variant)* { $($fieldname: ($fieldnameident),)* } =>
                $($qualified_variant)* { $($fieldname: $fieldnameident.clone(),)* },
            )*
          }
        }
      }
    }
  }
}

#[rules_derive(Clone)]
pub enum Foo {
    A,
    B { x: u32 },
    C(u8),
}

fn main() {
    let a = Foo::A;
    _ = a.clone();
}