use proc_macro2::TokenStream as TokenStream2;
use quote::quote;
use crate::codegen::CodeGenContext;
pub fn gen_lifecycle_overrides(ctx: &CodeGenContext) -> LifecycleOverrides {
let app_init = gen_app_init_impl(ctx);
let app_async_init = gen_app_async_init_impl(ctx);
let app_async_run = gen_app_async_run_impl(ctx);
let shutdown = gen_shutdown_impl(ctx);
LifecycleOverrides {
app_init,
app_async_init,
app_async_run,
shutdown,
}
}
pub struct LifecycleOverrides {
pub app_init: TokenStream2,
pub app_async_init: TokenStream2,
pub app_async_run: TokenStream2,
pub shutdown: TokenStream2,
}
fn gen_app_init_impl(ctx: &CodeGenContext) -> TokenStream2 {
if !ctx.comp_attr.has_app_init {
return quote! {};
}
quote! {
#[inline]
fn init(app: &::std::sync::Arc<::tx_di_core::App>) -> ::tx_di_core::RIE<()> {
let comp: ::std::sync::Arc<Self> = ::tx_di_core::inject_from_store(&app.store);
self::app_init(comp, app)
}
}
}
fn gen_app_async_init_impl(ctx: &CodeGenContext) -> TokenStream2 {
if !ctx.comp_attr.has_app_async_init {
return quote! {};
}
quote! {
#[inline]
fn async_init(app: &::std::sync::Arc<::tx_di_core::App>) -> ::tx_di_core::BoxFuture<::tx_di_core::RIE<()>> {
let comp: ::std::sync::Arc<Self> = ::tx_di_core::inject_from_store(&app.store);
let app = app.clone();
::std::boxed::Box::pin(async move {
self::app_async_init(comp, app).await
})
}
}
}
fn gen_app_async_run_impl(ctx: &CodeGenContext) -> TokenStream2 {
if !ctx.comp_attr.has_app_async_run {
return quote! {};
}
quote! {
#[inline]
fn async_run(
app: &::std::sync::Arc<::tx_di_core::App>,
token: ::tx_di_core::CancellationToken,
) -> ::tx_di_core::BoxFuture<::tx_di_core::RIE<()>> {
let comp: ::std::sync::Arc<Self> = ::tx_di_core::inject_from_store(&app.store);
let app = app.clone();
::std::boxed::Box::pin(async move {
self::app_async_run(comp, app, token).await
})
}
}
}
fn gen_shutdown_impl(ctx: &CodeGenContext) -> TokenStream2 {
if !ctx.comp_attr.has_shutdown {
return quote! {};
}
quote! {
#[inline]
fn shutdown(&self) {
self::shutdown(self)
}
}
}