diff options
author | Aaron O'Mullan <aaron.omullan@gmail.com> | 2022-04-02 00:09:21 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-04-02 00:09:21 +0200 |
commit | 25b6b2ed66c001143811efb8b65407b4803e65c4 (patch) | |
tree | 98a629f164f341409f3096df009c4ba93f2613c0 /ops/lib.rs | |
parent | 1535fdd94902207bb3a563834700594bb6e8add9 (diff) |
feat(ops): #[op(unstable)] (#14124)
Diffstat (limited to 'ops/lib.rs')
-rw-r--r-- | ops/lib.rs | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/ops/lib.rs b/ops/lib.rs index 61ad876d3..54f4212bc 100644 --- a/ops/lib.rs +++ b/ops/lib.rs @@ -34,8 +34,33 @@ fn core_import() -> TokenStream2 { } } +#[derive(Debug)] +struct MacroArgs { + is_unstable: bool, +} + +impl syn::parse::Parse for MacroArgs { + fn parse(input: syn::parse::ParseStream) -> syn::Result<Self> { + let vars = + syn::punctuated::Punctuated::<Ident, syn::Token![,]>::parse_terminated( + input, + )?; + let vars: Vec<_> = vars.iter().map(Ident::to_string).collect(); + let vars: Vec<_> = vars.iter().map(String::as_str).collect(); + match vars[..] { + ["unstable"] => Ok(Self { is_unstable: true }), + [] => Ok(Self { is_unstable: false }), + _ => Err(syn::Error::new( + input.span(), + "Ops expect #[op] or #[op(unstable)]", + )), + } + } +} + #[proc_macro_attribute] -pub fn op(_attr: TokenStream, item: TokenStream) -> TokenStream { +pub fn op(attr: TokenStream, item: TokenStream) -> TokenStream { + let MacroArgs { is_unstable } = syn::parse_macro_input!(attr as MacroArgs); let func = syn::parse::<syn::ItemFn>(item).expect("expected a function"); let name = &func.sig.ident; let generics = &func.sig.generics; @@ -85,6 +110,7 @@ pub fn op(_attr: TokenStream, item: TokenStream) -> TokenStream { v8_fn_ptr: Self::v8_fn_ptr::<#type_params>(), enabled: true, is_async: #is_async, + is_unstable: #is_unstable, } } |