accepts-codegen 0.0.1

Rust toolkit for composing synchronous and asynchronous acceptor pipelines
Documentation
use proc_macro2::TokenStream;
use quote::ToTokens;
use syn::parse::{Parse, ParseStream, Parser};

use crate::{
    acceptor::{
        accepts_auto_impl::args::{AcceptsImplData, AsyncAutoImplArgs, AutoPinDynAcceptsArgs},
        common::ast::accepts_trait_ast::{Accepts, AsyncAccepts},
    },
    common::{context::CodegenContext, function::map_err_to_compile_error, macros::ok_or_return},
};

use super::builder::{build_async_auto_impl, build_dyn_auto_impl};

pub fn expand_async_impl(
    ctx: &CodegenContext,
    attr: TokenStream,
    mut item: TokenStream,
) -> TokenStream {
    let args: AsyncAutoImplArgs = ok_or_return!(map_err_to_compile_error(
        (|i: ParseStream| Parse::parse(i)).parse2(attr)
    ));

    let base: AcceptsImplData = ok_or_return!(map_err_to_compile_error(
        (|i: ParseStream| AcceptsImplData::parse(Accepts, i)).parse2(item.clone())
    ));

    build_async_auto_impl(ctx, base.accepts_t_type, args.outer_attrs)
        .into_item_impl_from_type(ctx, base.self_ty, base.generics)
        .to_tokens(&mut item);

    item
}

pub fn expand_dyn_impl(
    ctx: &CodegenContext,
    attr: TokenStream,
    mut item: TokenStream,
) -> TokenStream {
    let args: AutoPinDynAcceptsArgs = ok_or_return!(map_err_to_compile_error(
        (|i: ParseStream| Parse::parse(i)).parse2(attr)
    ));
    let base: AcceptsImplData = ok_or_return!(map_err_to_compile_error(
        (|i: ParseStream| AcceptsImplData::parse(AsyncAccepts, i)).parse2(item.clone())
    ));

    build_dyn_auto_impl(ctx, base.accepts_t_type, args.outer_attrs)
        .into_item_impl_from_type(ctx, base.self_ty, base.generics)
        .to_tokens(&mut item);

    item
}