Skip to main content

canic_core/api/
component_runtime.rs

1//! Module: api::component_runtime
2//!
3//! Responsibility: expose managed Component Directory preparation and runtime activation.
4//! Does not own: validation, stable mutation, endpoint authorization, or root distribution.
5//! Boundary: maps typed internal failures into Canic's public error contract.
6
7use crate::{
8    dto::{
9        component_registry::{
10            ComponentRuntimeActivationRequest, ComponentRuntimeDirectoryPreparationRequest,
11            ComponentRuntimeDirectorySynchronizationRequest, ComponentRuntimeStatusResponse,
12        },
13        error::Error,
14        role::ComponentRuntimeOperationStatus,
15    },
16    workflow::{component_runtime, runtime::fleet_activation::FleetActivationWorkflow},
17};
18
19///
20/// ComponentRuntimeApi
21///
22
23pub struct ComponentRuntimeApi;
24
25impl ComponentRuntimeApi {
26    /// Converge one managed runtime through its single role-owned command.
27    pub fn configure(
28        request: ComponentRuntimeDirectoryPreparationRequest,
29    ) -> Result<crate::view::fleet_activation::ComponentRuntimeActivationTransition, Error> {
30        component_runtime::configure(request).map_err(Error::from)
31    }
32
33    pub fn prepare_directory(
34        request: ComponentRuntimeDirectoryPreparationRequest,
35    ) -> Result<ComponentRuntimeStatusResponse, Error> {
36        component_runtime::prepare_directory(request).map_err(Error::from)
37    }
38
39    pub fn status() -> Result<ComponentRuntimeStatusResponse, Error> {
40        component_runtime::status().map_err(Error::from)
41    }
42
43    /// Return the complete target-local runtime configuration operation projection.
44    pub fn operation_status(
45        operation_id: [u8; 32],
46    ) -> Result<ComponentRuntimeOperationStatus, Error> {
47        let fleet_activation = FleetActivationWorkflow::status().map_err(Error::from)?;
48        let runtime = component_runtime::status().map_err(Error::from)?;
49        if fleet_activation.identity.operation_id != operation_id
50            || runtime.operation_id != operation_id
51        {
52            return Err(Error::from_registered(
53                crate::diagnostics::codes::STATE_CONFLICT,
54            ));
55        }
56
57        Ok(ComponentRuntimeOperationStatus {
58            operation_id,
59            fleet_activation,
60            runtime,
61        })
62    }
63
64    pub fn synchronize_directory(
65        request: ComponentRuntimeDirectorySynchronizationRequest,
66    ) -> Result<ComponentRuntimeStatusResponse, Error> {
67        component_runtime::synchronize_directory(request).map_err(Error::from)
68    }
69
70    pub fn activate(
71        request: ComponentRuntimeActivationRequest,
72    ) -> Result<crate::view::fleet_activation::ComponentRuntimeActivationTransition, Error> {
73        component_runtime::activate(request).map_err(Error::from)
74    }
75}