accepts_codegen/acceptor/accepts_auto_impl/
expand.rs1use 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}