From 032e28dc3d7bdb759bde879ba9f42a68ae23e25b Mon Sep 17 00:00:00 2001 From: Max Audron Date: Wed, 1 Dec 2021 16:19:54 +0100 Subject: add sync proc macro --- derive/src/sync/mod.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 derive/src/sync/mod.rs (limited to 'derive/src/sync') 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, +} + +impl Parse for Sync { + fn parse(input: ParseStream) -> Result { + 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() +} -- cgit v1.2.3