From e1e3cddd9466675463ba322e3e2f9de0968097c5 Mon Sep 17 00:00:00 2001 From: Restioson Date: Tue, 19 Jul 2022 10:56:53 +0200 Subject: [PATCH] Add #[blocking_handler] to wrap handler in block_in_place --- src/lib.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/lib.rs b/src/lib.rs index e1d4026..3987edc 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -60,7 +60,7 @@ pub fn xtra_productivity(_attribute: TokenStream, item: TokenStream) -> TokenStr ReturnType::Type(_, ref t) => quote! { #t } }; - let attrs = method.attrs; + let mut attrs = method.attrs; #[cfg(feature = "instrumentation")] let instrument = if !attrs.iter().any(|attr| attr.path.segments.last().unwrap().ident == "instrument") { @@ -80,6 +80,13 @@ pub fn xtra_productivity(_attribute: TokenStream, item: TokenStream) -> TokenStr #[cfg(not(feature = "instrumentation"))] let instrument = quote!(); + let method_block = if let Some(idx) = attrs.iter().position(|attr| attr.path.is_ident("blocking_handler")) { + let _ = attrs.swap_remove(idx); + quote!({ ::tokio::task::block_in_place(move || #method_block ) }) + } else { + quote!(#method_block) + }; + quote! { #[async_trait::async_trait] impl<#generic_params> xtra::Handler<#message_type> for #actor