Skip to main content

harmos_operations/lifecycle/
mod.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12mod cancel;
13mod initialize;
14mod shutdown;
15mod status;
16mod watch;
17
18/* === Re-Exports === */
19
20pub use cancel::Cancel;
21pub use harmos_domain::model::operations::lifecycle::*;
22#[cfg(feature = "lifecycle")]
23pub use initialize::ControlError;
24pub use initialize::Initialize;
25pub use shutdown::Shutdown;
26pub use status::{InstanceState, Status};
27pub use watch::Watch;
28
29/* === Imports === */
30
31/* === Constants === */
32
33pub const POLICY: harmos_domain::OperationPolicy = harmos_domain::OperationPolicy {
34    timeout: std::time::Duration::from_secs(30),
35    attempt_timeout: std::time::Duration::from_secs(30),
36    retries: harmos_domain::RetryPolicy::Never,
37};
38const WATCH_POLICY: harmos_domain::OperationPolicy = harmos_domain::OperationPolicy {
39    timeout: harmos_domain::operations::UNBOUNDED,
40    attempt_timeout: harmos_domain::operations::UNBOUNDED,
41    ..POLICY
42};
43
44/* === Macros === */
45
46/* === Type Aliases === */
47
48/* === Structs === */
49
50/* === Enums === */
51
52#[harmos::catalog(harmos_path = crate)]
53pub enum Lifecycle {
54    Status(Status),
55    Cancel(Cancel),
56    Watch(Watch),
57}
58
59#[cfg(feature = "lifecycle")]
60pub fn bind<P: harmos_sdk::Plugin>(
61    owner: std::sync::Arc<harmos_sdk::plugin::Owner<P>>, table: &harmos_sdk::plugin::Table,
62) -> Result<(), harmos_sdk::plugin::Error<P>> {
63    use harmos_sdk::operations::lifecycle::LifecycleAccess;
64    let mut dependencies = harmos_sdk::Dependencies::new();
65    dependencies
66        .insert(std::sync::Arc::new(LifecycleAccess(owner)))
67        .map_err(|error| harmos_sdk::plugin::Error::Resource(std::sync::Arc::new(error)))?;
68    let mut table = table.lock().map_err(|_| harmos_sdk::plugin::Error::Poisoned)?;
69    let initialize = Descriptor::of_initialize::<P>()
70        .map_err(harmos_sdk::ServingError::from)
71        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
72    let shutdown = Descriptor::of_shutdown::<P>()
73        .map_err(harmos_sdk::ServingError::from)
74        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
75    table
76        .install_lifecycle::<Initialize, initialize::Control>(dependencies.clone(), initialize)
77        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
78    table
79        .install_lifecycle::<Shutdown, shutdown::Control>(dependencies, shutdown)
80        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))
81}
82
83/* === Traits === */
84
85/* === Implementations === */
86
87/* === Public Functions === */
88
89/* === Private Functions === */
90
91/* === Tests === */