struct_fields/
lib.rs

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}