diff options
Diffstat (limited to 'derive/src/lib.rs')
| -rw-r--r-- | derive/src/lib.rs | 36 |
1 files changed, 35 insertions, 1 deletions
diff --git a/derive/src/lib.rs b/derive/src/lib.rs index 606e8e3..dc6e9fe 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -3,13 +3,14 @@ use syn; mod from; mod network; mod sync; +mod setters; #[proc_macro_derive(NetworkList, attributes(network))] pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream { network::network_list(input) } -#[proc_macro_derive(NetworkMap, attributes(network))] +#[proc_macro_derive(NetworkMap, attributes(network, quassel))] pub fn network_map(input: proc_macro::TokenStream) -> proc_macro::TokenStream { network::network_map(input) } @@ -19,7 +20,40 @@ pub fn from(input: proc_macro::TokenStream) -> proc_macro::TokenStream { from::from(input) } +#[proc_macro_derive(Setters, attributes(quassel))] +pub fn setters(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + setters::setters(input) +} + #[proc_macro] pub fn sync(input: proc_macro::TokenStream) -> proc_macro::TokenStream { sync::sync(input) } + +use darling::FromField; + +#[derive(Debug, FromField)] +#[darling(attributes(quassel))] +struct QuasselField { + ident: Option<syn::Ident>, + ty: syn::Type, + + #[darling(default)] + name: String, +} + +impl QuasselField { + pub fn parse(input: &syn::DeriveInput) -> Vec<QuasselField> { + match &input.data { + syn::Data::Struct(data) => match &data.fields { + syn::Fields::Named(fields) => fields + .named + .iter() + .map(|field| QuasselField::from_field(field).expect("Could not parse quassel field")) + .collect(), + _ => panic!("quassel: not a named field"), + }, + _ => panic!("quassel: not a Struct"), + } + } +} |
