diff options
Diffstat (limited to 'derive')
| -rw-r--r-- | derive/src/lib.rs | 6 | ||||
| -rw-r--r-- | derive/src/sync/mod.rs | 43 |
2 files changed, 49 insertions, 0 deletions
diff --git a/derive/src/lib.rs b/derive/src/lib.rs index f3608eb..606e8e3 100644 --- a/derive/src/lib.rs +++ b/derive/src/lib.rs @@ -2,6 +2,7 @@ use syn; mod from; mod network; +mod sync; #[proc_macro_derive(NetworkList, attributes(network))] pub fn network_list(input: proc_macro::TokenStream) -> proc_macro::TokenStream { @@ -17,3 +18,8 @@ pub fn network_map(input: proc_macro::TokenStream) -> proc_macro::TokenStream { pub fn from(input: proc_macro::TokenStream) -> proc_macro::TokenStream { from::from(input) } + +#[proc_macro] +pub fn sync(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + sync::sync(input) +} diff --git a/derive/src/sync/mod.rs b/derive/src/sync/mod.rs new file mode 100644 index 0000000..40dea74 --- /dev/null +++ b/derive/src/sync/mod.rs @@ -0,0 +1,43 @@ +use quote::quote; +use syn::{ + self, bracketed, + parse::{Parse, ParseStream}, + parse_macro_input, + punctuated::Punctuated, + token, Expr, Result, Token, +}; + +#[derive(Debug)] +struct Sync { + name: Expr, + token: Token![,], + brace_token: token::Bracket, + fields: Punctuated<Expr, Token![,]>, +} + +impl Parse for Sync { + fn parse(input: ParseStream) -> Result<Self> { + let content; + Ok(Sync { + name: input.parse()?, + token: input.parse()?, + brace_token: bracketed!(content in input), + fields: content.parse_terminated(Expr::parse)?, + }) + } +} + +pub fn sync(input: proc_macro::TokenStream) -> proc_macro::TokenStream { + let input = parse_macro_input!(input as Sync); + let name = input.name; + let values = input.fields.iter(); + + let gen = quote! { + self.send_sync( + #name, + vec![#(#values.into()),*], + ) + }; + + gen.into() +} |
