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
23#[cfg(feature = "lifecycle")]
24pub use initialize::ControlError;
25pub use initialize::Initialize;
26pub use shutdown::Shutdown;
27pub use status::{InstanceState, Status};
28pub use watch::Watch;
29
30/* === Imports === */
31
32// Standard Library Imports
33
34// Third Party Imports
35
36// Local Imports
37
38/* === Constants === */
39
40pub const POLICY: harmos_domain::OperationPolicy = harmos_domain::OperationPolicy {
41    timeout: std::time::Duration::from_secs(30),
42    attempt_timeout: std::time::Duration::from_secs(30),
43    retries: harmos_domain::RetryPolicy::Never,
44};
45const WATCH_POLICY: harmos_domain::OperationPolicy = harmos_domain::OperationPolicy {
46    timeout: harmos_domain::operations::UNBOUNDED,
47    attempt_timeout: harmos_domain::operations::UNBOUNDED,
48    ..POLICY
49};
50
51/* === Macros === */
52
53/* === Type Aliases === */
54
55/* === Structs === */
56
57/* === Enums === */
58
59#[harmos::catalog(harmos_path = crate)]
60pub enum Lifecycle {
61    Status(Status),
62    Cancel(Cancel),
63    Watch(Watch),
64}
65
66/* === Traits === */
67
68/* === Implementations === */
69
70/* === Public Functions === */
71
72#[cfg(feature = "lifecycle")]
73pub fn bind<P: harmos_sdk::Plugin>(
74    owner: std::sync::Arc<harmos_sdk::plugin::Owner<P>>, table: &harmos_sdk::plugin::Table,
75) -> Result<(), harmos_sdk::plugin::Error<P>> {
76    use harmos_sdk::operations::lifecycle::LifecycleAccess;
77    let mut dependencies = harmos_sdk::__private::ResourceSet::new();
78    dependencies
79        .insert(std::sync::Arc::new(LifecycleAccess(owner)))
80        .map_err(|error| harmos_sdk::plugin::Error::Resource(std::sync::Arc::new(error)))?;
81    let mut table = table.lock().map_err(|_| harmos_sdk::plugin::Error::Poisoned)?;
82    let initialize = Descriptor::of_initialize::<P>()
83        .map_err(harmos_sdk::ServingError::from)
84        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
85    let shutdown = Descriptor::of_shutdown::<P>()
86        .map_err(harmos_sdk::ServingError::from)
87        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
88    table
89        .install_lifecycle::<Initialize, initialize::Control>(dependencies.clone(), initialize)
90        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))?;
91    table
92        .install_lifecycle::<Shutdown, shutdown::Control>(dependencies, shutdown)
93        .map_err(|error| harmos_sdk::plugin::Error::Serving(std::sync::Arc::new(error)))
94}
95
96/* === Private Functions === */
97
98/* === Tests === */