diff --git a/trait-variant/examples/variant.rs b/trait-variant/examples/variant.rs index 93c2ebe..5be07ef 100644 --- a/trait-variant/examples/variant.rs +++ b/trait-variant/examples/variant.rs @@ -10,8 +10,8 @@ use std::future::Future; use trait_variant::make_variant; -#[make_variant(SendIntFactory: Send)] -trait IntFactory { +#[make_variant(IntFactory: Send)] +pub trait LocalIntFactory { const NAME: &'static str; type MyFut<'a>: Future @@ -24,4 +24,11 @@ trait IntFactory { fn another_async(&self, input: Result<(), &str>) -> Self::MyFut<'_>; } +#[allow(dead_code)] +fn spawn_task(factory: impl IntFactory + 'static) { + tokio::spawn(async move { + let _int = factory.make(1, "foo").await; + }); +} + fn main() {} diff --git a/trait-variant/src/variant.rs b/trait-variant/src/variant.rs index 1a5bd1f..8280599 100644 --- a/trait-variant/src/variant.rs +++ b/trait-variant/src/variant.rs @@ -56,15 +56,29 @@ pub fn make_variant( let attrs = parse_macro_input!(attr as Attrs); let item = parse_macro_input!(item as ItemTrait); + let maybe_allow_async_lint = if attrs + .variant + .bounds + .iter() + .any(|b| b.path.segments.last().unwrap().ident == "Send") + { + quote! { #[allow(async_fn_in_trait)] } + } else { + quote! {} + }; + let variant = mk_variant(&attrs, &item); let blanket_impl = mk_blanket_impl(&attrs, &item); - let output = quote! { + + quote! { + #maybe_allow_async_lint #item + #variant - #blanket_impl - }; - output.into() + #blanket_impl + } + .into() } fn mk_variant(attrs: &Attrs, tr: &ItemTrait) -> TokenStream {