1#[macro_export]
12macro_rules! derive_for {
13 (($b:ident $(,$a:ident)*); $(#[$attr:meta])* $vis:vis struct $name:ident($($fields:tt)*); $($rest:tt)*) => {
15 #[derive($($a,)* $b)]
16 $(#[$attr])*
17 $vis struct $name($($fields)*);
18 derive_for!( ($b, $($a,)*); $($rest)*);
19 };
20 (($b:ident $(,$a:ident)*,); $(#[$attr:meta])* $vis:vis struct $name:ident($($fields:tt)*); $($rest:tt)*) => {
22 #[derive($($a,)* $b)]
23 $(#[$attr])*
24 $vis struct $name($($fields)*);
25 derive_for!( ($b, $($a,)*); $($rest)*);
26 };
27 (($b:ident $(,$a:ident)*); $(#[$attr:meta])* $vis:vis struct $name:ident{ $($fields:tt)* }; $($rest:tt)*) => {
29 #[derive($($a,)* $b)]
30 $(#[$attr])*
31 $vis struct $name{ $($fields)* }
32 derive_for!( ($b, $($a,)*); $($rest)*);
33 };
34 (($b:ident $(,$a:ident)*,); $(#[$attr:meta])* $vis:vis struct $name:ident{ $($fields:tt)* }; $($rest:tt)*) => {
36 #[derive($($a,)* $b)]
37 $(#[$attr])*
38 $vis struct $name{ $($fields)* }
39 derive_for!( ($b, $($a,)*); $($rest)*);
40 };
41 (($($_:ident,)*);) => {};
42}
43
44#[cfg(test)]
45#[macro_use]
46mod tests {
47 use crate::derive_for;
48
49 derive_for!(
50 ( Clone, Debug, PartialEq, Eq);
51 pub struct Foo{a: i32, name: String};
52 pub struct Bar(u32, u32);
53 );
54
55 #[test]
56 pub fn test() {
57 let foo = Foo {
58 a: 5,
59 name: "Hello".into(),
60 };
61 let bar = Bar(3, 6);
62
63 println!("{:?}, {:?}", foo, bar);
65
66 assert_eq!(
68 foo,
69 Foo {
70 a: 5,
71 name: "Hello".into()
72 }
73 );
74 assert_eq!(bar, Bar(3, 6));
75
76 assert_eq!(foo, foo.clone());
78 assert_eq!(bar, bar.clone());
79 }
80}