1#[macro_export]
2macro_rules! struct_fields {
3 (
4 $(#[$meta:meta])*
5 $vis:vis struct $name:ident {
6 $($(#[$vmeta:meta])* $fieldVis:vis $vname:ident : $tname:ty,)*
7 }
8 ) => {
9 $(#[$meta])*
10 $vis struct $name {
11 $($(#[$vmeta])* $fieldVis $vname:$tname,)+
12 }
13 affix::paste!{
14 #[derive(Debug)]
15 $vis struct [<$name Fields>] {
16 $(pub $vname:&'static str,)+
17 }
18
19 impl $name{
20 $vis fn fields() -> &'static [<$name Fields>] {
21 &[<$name Fields>] {
22 $($vname:stringify!([<$vname:camel>]),)+
23 }
24 }
25 }
26 }
27 }
28}
29
30#[cfg(test)]
31#[allow(unused)]
32mod tests {
33 struct_fields! {
34 #[derive(Clone)]
35 pub struct TestStruct{
36 _id:String,
37 name:String,
38 }
39 }
40 #[test]
41 fn it_works() {
42 assert_eq!(TestStruct::fields()._id, "id");
43 assert_eq!(TestStruct::fields().name, "name");
44 }
45}