accepts_codegen/acceptor/accepts_auto_impl/
expand.rs

1use proc_macro2::TokenStream;
2use quote::ToTokens;
3use syn::parse::{Parse, ParseStream, Parser};
4
5use crate::{
6    acceptor::{
7        accepts_auto_impl::args::{AcceptsImplData, AsyncAutoImplArgs, AutoPinDynAcceptsArgs},
8        common::ast::accepts_trait_ast::{Accepts, AsyncAccepts},
9    },
10    common::{context::CodegenContext, function::map_err_to_compile_error, macros::ok_or_return},
11};
12
13use super::builder::{build_async_auto_impl, build_dyn_auto_impl};
14
15pub fn expand_async_impl(
16    ctx: &CodegenContext,
17    attr: TokenStream,
18    mut item: TokenStream,
19) -> TokenStream {
20    let args: AsyncAutoImplArgs = ok_or_return!(map_err_to_compile_error(
21        (|i: ParseStream| Parse::parse(i)).parse2(attr)
22    ));
23
24    let base: AcceptsImplData = ok_or_return!(map_err_to_compile_error(
25        (|i: ParseStream| AcceptsImplData::parse(Accepts, i)).parse2(item.clone())
26    ));
27
28    build_async_auto_impl(ctx, base.accepts_t_type, args.outer_attrs)
29        .into_item_impl_from_type(ctx, base.self_ty, base.generics)
30        .to_tokens(&mut item);
31
32    item
33}
34
35pub fn expand_dyn_impl(
36    ctx: &CodegenContext,
37    attr: TokenStream,
38    mut item: TokenStream,
39) -> TokenStream {
40    let args: AutoPinDynAcceptsArgs = ok_or_return!(map_err_to_compile_error(
41        (|i: ParseStream| Parse::parse(i)).parse2(attr)
42    ));
43    let base: AcceptsImplData = ok_or_return!(map_err_to_compile_error(
44        (|i: ParseStream| AcceptsImplData::parse(AsyncAccepts, i)).parse2(item.clone())
45    ));
46
47    build_dyn_auto_impl(ctx, base.accepts_t_type, args.outer_attrs)
48        .into_item_impl_from_type(ctx, base.self_ty, base.generics)
49        .to_tokens(&mut item);
50
51    item
52}