Skip to main content

canic_core/api/application_startup/
mod.rs

1//! Module: api::application_startup
2//!
3//! Lifecycle adapter for protected application release and deferred initialization.
4
5use crate::{
6    dto::{caller_authority::CallerAuthorityPublication, error::Error},
7    workflow::runtime::application_startup,
8};
9use std::future::Future;
10
11///
12/// ApplicationStartupApi
13///
14/// Hidden adapter used by generated managed lifecycle endpoints.
15///
16
17#[doc(hidden)]
18pub struct ApplicationStartupApi;
19
20impl ApplicationStartupApi {
21    pub fn release(publication: CallerAuthorityPublication) -> Result<(), Error> {
22        application_startup::release(publication).map_err(Into::into)
23    }
24
25    /// Stop a later lifecycle effect if its retained startup release has been fenced.
26    pub fn require_initialization_effect() {
27        application_startup::require_initialization_effect().unwrap_or_else(|error| {
28            ic_cdk::trap(format!("application initialization fenced: {error}"))
29        });
30    }
31
32    /// Stop a later upgrade hook if application admission changed during setup.
33    pub fn require_upgrade_effect() {
34        application_startup::require_started()
35            .unwrap_or_else(|error| ic_cdk::trap(format!("application upgrade fenced: {error}")));
36    }
37
38    /// Schedule pending original initialization through the retained native claim.
39    pub fn schedule_required<F: Future<Output = ()> + 'static>(hook: fn(Option<Vec<u8>>) -> F) {
40        application_startup::schedule(hook)
41            .unwrap_or_else(|error| ic_cdk::trap(format!("application startup rejected: {error}")));
42    }
43
44    /// Application upgrade hooks are admitted only after the original initialization finished.
45    #[must_use]
46    pub fn is_started() -> bool {
47        application_startup::require_started().is_ok()
48    }
49}