auto_enums/derive/core/
future.rs

1// SPDX-License-Identifier: Apache-2.0 OR MIT
2
3use crate::derive::prelude::*;
4
5pub(crate) const NAME: &[&str] = &["Future"];
6
7pub(crate) fn derive(cx: &Context, data: &Data) -> Result<TokenStream> {
8    cx.needs_pin_projection();
9
10    let ident = &data.ident;
11    let pin = quote!(::core::pin::Pin);
12    let trait_ = parse_quote!(::core::future::Future);
13    let mut impl_ = EnumImpl::from_trait(data, &trait_, None, parse_quote! {
14        trait Future {
15            type Output;
16        }
17    })
18    .build_impl();
19
20    let poll = data.variant_idents().zip(data.field_types()).map(|(v, ty)| {
21        quote! {
22            #ident::#v(x) => <#ty as #trait_>::poll(#pin::new_unchecked(x), cx),
23        }
24    });
25    impl_.items.push(parse_quote! {
26        #[inline]
27        fn poll(
28            self: #pin<&mut Self>,
29            cx: &mut ::core::task::Context<'_>,
30        ) -> ::core::task::Poll<Self::Output> {
31            unsafe {
32                match self.get_unchecked_mut() { #(#poll)* }
33            }
34        }
35    });
36
37    Ok(impl_.into_token_stream())
38}