aboutsummaryrefslogtreecommitdiff
path: root/derive/src/sync
diff options
context:
space:
mode:
authorMax Audron <audron@cocaine.farm>2021-12-01 16:19:54 +0100
committerMax Audron <audron@cocaine.farm>2021-12-01 16:19:54 +0100
commit032e28dc3d7bdb759bde879ba9f42a68ae23e25b (patch)
tree90880332f2a870ba89ad10118c623af1ac512560 /derive/src/sync
parentfix bufferviewconfig remove and add methods (diff)
add sync proc macro
Diffstat (limited to 'derive/src/sync')
-rw-r--r--derive/src/sync/mod.rs43
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()
+}