From ff978d3c80fa99cf2dc3fa93bd5ce619e54e6875 Mon Sep 17 00:00:00 2001 From: Ozgun Ozerk Date: Mon, 3 Feb 2025 19:31:24 +0300 Subject: [PATCH 1/5] retaing other macros --- Cargo.lock | 8 ++++---- contracts/utils/pausable-macros/src/lib.rs | 4 ++++ 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index d38cfba..5ac3ccb 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -543,7 +543,7 @@ checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" [[package]] name = "fungible-pausable-example" -version = "0.0.0" +version = "0.1.0" dependencies = [ "openzeppelin-fungible-token", "openzeppelin-pausable", @@ -811,14 +811,14 @@ checksum = "1261fe7e33c73b354eab43b1273a57c8f967d0391e80353e51f764ac02cf6775" [[package]] name = "openzeppelin-fungible-token" -version = "0.0.0" +version = "0.1.0" dependencies = [ "soroban-sdk", ] [[package]] name = "openzeppelin-pausable" -version = "0.0.0" +version = "0.1.0" dependencies = [ "soroban-sdk", ] @@ -852,7 +852,7 @@ checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a" [[package]] name = "pausable-example" -version = "0.0.0" +version = "0.1.0" dependencies = [ "openzeppelin-pausable", "openzeppelin-pausable-macros", diff --git a/contracts/utils/pausable-macros/src/lib.rs b/contracts/utils/pausable-macros/src/lib.rs index 07245c2..31f56e0 100644 --- a/contracts/utils/pausable-macros/src/lib.rs +++ b/contracts/utils/pausable-macros/src/lib.rs @@ -34,6 +34,7 @@ pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_vis = &input_fn.vis; let fn_sig = &input_fn.sig; let fn_block = &input_fn.block; + let fn_attrs = &input_fn.attrs; // get the other macros let env_arg = if is_ref { quote! { #env_ident } @@ -42,6 +43,7 @@ pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { }; let output = quote! { + #(#fn_attrs)* // retain other macros #fn_vis #fn_sig { openzeppelin_pausable::when_not_paused(#env_arg); @@ -80,6 +82,7 @@ pub fn when_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_vis = &input_fn.vis; let fn_sig = &input_fn.sig; let fn_block = &input_fn.block; + let fn_attrs = &input_fn.attrs; // get the other macros let env_arg = if is_ref { quote! { #env_ident } @@ -88,6 +91,7 @@ pub fn when_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { }; let output = quote! { + #(#fn_attrs)* // retain other macros #fn_vis #fn_sig { openzeppelin_pausable::when_paused(#env_arg); From cbb26ebf2326336fe01230bfc8309d6c45799bed Mon Sep 17 00:00:00 2001 From: Ozgun Ozerk Date: Tue, 4 Feb 2025 09:16:25 +0300 Subject: [PATCH 2/5] filter out the current macro --- contracts/utils/pausable-macros/src/lib.rs | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/contracts/utils/pausable-macros/src/lib.rs b/contracts/utils/pausable-macros/src/lib.rs index 31f56e0..8ee4d9c 100644 --- a/contracts/utils/pausable-macros/src/lib.rs +++ b/contracts/utils/pausable-macros/src/lib.rs @@ -34,7 +34,9 @@ pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_vis = &input_fn.vis; let fn_sig = &input_fn.sig; let fn_block = &input_fn.block; - let fn_attrs = &input_fn.attrs; // get the other macros + // Filter out the current macro from attributes + let fn_attrs: Vec<_> = + input_fn.attrs.iter().filter(|attr| !attr.path().is_ident("when_not_paused")).collect(); let env_arg = if is_ref { quote! { #env_ident } @@ -82,7 +84,9 @@ pub fn when_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { let fn_vis = &input_fn.vis; let fn_sig = &input_fn.sig; let fn_block = &input_fn.block; - let fn_attrs = &input_fn.attrs; // get the other macros + // Filter out the current macro from attributes + let fn_attrs: Vec<_> = + input_fn.attrs.iter().filter(|attr| !attr.path().is_ident("when_paused")).collect(); let env_arg = if is_ref { quote! { #env_ident } From 62a8ecdd162df53baa550166bdb9066d91dabd07 Mon Sep 17 00:00:00 2001 From: Ozgun Ozerk Date: Tue, 4 Feb 2025 09:20:20 +0300 Subject: [PATCH 3/5] reuse the duplicated code across macros --- contracts/utils/pausable-macros/src/helper.rs | 36 +++++++++++- contracts/utils/pausable-macros/src/lib.rs | 58 +------------------ 2 files changed, 37 insertions(+), 57 deletions(-) diff --git a/contracts/utils/pausable-macros/src/helper.rs b/contracts/utils/pausable-macros/src/helper.rs index f6cf1ef..8bafc7d 100644 --- a/contracts/utils/pausable-macros/src/helper.rs +++ b/contracts/utils/pausable-macros/src/helper.rs @@ -1,6 +1,38 @@ -use syn::{FnArg, ItemFn, PatType, Type}; +use proc_macro::TokenStream; +use quote::quote; +use syn::{parse_macro_input, FnArg, ItemFn, PatType, Type}; -pub fn check_env_arg(input_fn: &ItemFn) -> (syn::Ident, bool) { +pub fn generate_pause_check(item: TokenStream, check_fn: &str, macro_name: &str) -> TokenStream { + let input_fn = parse_macro_input!(item as ItemFn); + let (env_ident, is_ref) = check_env_arg(&input_fn); + + let fn_vis = &input_fn.vis; + let fn_sig = &input_fn.sig; + let fn_block = &input_fn.block; + // Filter out the current macro from attributes + let fn_attrs: Vec<_> = + input_fn.attrs.iter().filter(|attr| !attr.path().is_ident(macro_name)).collect(); + + let env_arg = if is_ref { + quote! { #env_ident } + } else { + quote! { &#env_ident } + }; + + let check_ident = syn::Ident::new(check_fn, proc_macro2::Span::call_site()); + let output = quote! { + #(#fn_attrs)* // retain other macros + #fn_vis #fn_sig { + openzeppelin_pausable::#check_ident(#env_arg); + + #fn_block + } + }; + + output.into() +} + +fn check_env_arg(input_fn: &ItemFn) -> (syn::Ident, bool) { // Get the first argument let first_arg = input_fn.sig.inputs.first().unwrap_or_else(|| { panic!("function '{}' must have at least one argument", input_fn.sig.ident) diff --git a/contracts/utils/pausable-macros/src/lib.rs b/contracts/utils/pausable-macros/src/lib.rs index 8ee4d9c..651fbfb 100644 --- a/contracts/utils/pausable-macros/src/lib.rs +++ b/contracts/utils/pausable-macros/src/lib.rs @@ -1,8 +1,6 @@ use proc_macro::TokenStream; -use quote::quote; -use syn::{parse_macro_input, ItemFn}; -use crate::helper::check_env_arg; +use crate::helper::generate_pause_check; mod helper; @@ -28,32 +26,7 @@ mod helper; /// ``` #[proc_macro_attribute] pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { - let input_fn = parse_macro_input!(item as ItemFn); - let (env_ident, is_ref) = check_env_arg(&input_fn); - - let fn_vis = &input_fn.vis; - let fn_sig = &input_fn.sig; - let fn_block = &input_fn.block; - // Filter out the current macro from attributes - let fn_attrs: Vec<_> = - input_fn.attrs.iter().filter(|attr| !attr.path().is_ident("when_not_paused")).collect(); - - let env_arg = if is_ref { - quote! { #env_ident } - } else { - quote! { &#env_ident } - }; - - let output = quote! { - #(#fn_attrs)* // retain other macros - #fn_vis #fn_sig { - openzeppelin_pausable::when_not_paused(#env_arg); - - #fn_block - } - }; - - output.into() + generate_pause_check(item, "when_not_paused", "when_not_paused") } /// Adds a pause check at the beginning of the function that ensures the @@ -78,30 +51,5 @@ pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn when_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { - let input_fn = parse_macro_input!(item as ItemFn); - let (env_ident, is_ref) = check_env_arg(&input_fn); - - let fn_vis = &input_fn.vis; - let fn_sig = &input_fn.sig; - let fn_block = &input_fn.block; - // Filter out the current macro from attributes - let fn_attrs: Vec<_> = - input_fn.attrs.iter().filter(|attr| !attr.path().is_ident("when_paused")).collect(); - - let env_arg = if is_ref { - quote! { #env_ident } - } else { - quote! { &#env_ident } - }; - - let output = quote! { - #(#fn_attrs)* // retain other macros - #fn_vis #fn_sig { - openzeppelin_pausable::when_paused(#env_arg); - - #fn_block - } - }; - - output.into() + generate_pause_check(item, "when_paused", "when_paused") } From a2c7f7342df0375f3cdd6ec363c9419213829d8c Mon Sep 17 00:00:00 2001 From: Ozgun Ozerk Date: Mon, 17 Feb 2025 18:38:49 +0300 Subject: [PATCH 4/5] remove unnecessary filter --- contracts/utils/pausable-macros/src/helper.rs | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/contracts/utils/pausable-macros/src/helper.rs b/contracts/utils/pausable-macros/src/helper.rs index 8bafc7d..d6d6cf5 100644 --- a/contracts/utils/pausable-macros/src/helper.rs +++ b/contracts/utils/pausable-macros/src/helper.rs @@ -9,9 +9,7 @@ pub fn generate_pause_check(item: TokenStream, check_fn: &str, macro_name: &str) let fn_vis = &input_fn.vis; let fn_sig = &input_fn.sig; let fn_block = &input_fn.block; - // Filter out the current macro from attributes - let fn_attrs: Vec<_> = - input_fn.attrs.iter().filter(|attr| !attr.path().is_ident(macro_name)).collect(); + let fn_attrs = &input_fn.attrs; let env_arg = if is_ref { quote! { #env_ident } From 544354d2b43b8b76a272e9e5b309666d637ed135 Mon Sep 17 00:00:00 2001 From: Ozgun Ozerk Date: Mon, 17 Feb 2025 18:49:02 +0300 Subject: [PATCH 5/5] remove unused variable --- contracts/utils/pausable-macros/src/helper.rs | 2 +- contracts/utils/pausable-macros/src/lib.rs | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/contracts/utils/pausable-macros/src/helper.rs b/contracts/utils/pausable-macros/src/helper.rs index d6d6cf5..4234c94 100644 --- a/contracts/utils/pausable-macros/src/helper.rs +++ b/contracts/utils/pausable-macros/src/helper.rs @@ -2,7 +2,7 @@ use proc_macro::TokenStream; use quote::quote; use syn::{parse_macro_input, FnArg, ItemFn, PatType, Type}; -pub fn generate_pause_check(item: TokenStream, check_fn: &str, macro_name: &str) -> TokenStream { +pub fn generate_pause_check(item: TokenStream, check_fn: &str) -> TokenStream { let input_fn = parse_macro_input!(item as ItemFn); let (env_ident, is_ref) = check_env_arg(&input_fn); diff --git a/contracts/utils/pausable-macros/src/lib.rs b/contracts/utils/pausable-macros/src/lib.rs index 651fbfb..ae77c33 100644 --- a/contracts/utils/pausable-macros/src/lib.rs +++ b/contracts/utils/pausable-macros/src/lib.rs @@ -26,7 +26,7 @@ mod helper; /// ``` #[proc_macro_attribute] pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { - generate_pause_check(item, "when_not_paused", "when_not_paused") + generate_pause_check(item, "when_not_paused") } /// Adds a pause check at the beginning of the function that ensures the @@ -51,5 +51,5 @@ pub fn when_not_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { /// ``` #[proc_macro_attribute] pub fn when_paused(_attr: TokenStream, item: TokenStream) -> TokenStream { - generate_pause_check(item, "when_paused", "when_paused") + generate_pause_check(item, "when_paused") }