aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--derive/src/lib.rs6
-rw-r--r--derive/src/sync/mod.rs43
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()
+}