diff options
Diffstat (limited to 'derive/src/sync')
| -rw-r--r-- | derive/src/sync/mod.rs | 43 |
1 files changed, 43 insertions, 0 deletions
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() +} |
