Skip to main content

harmos_operations/lifecycle/
initialize.rs

1/* ***
2 *
3 * Harmos
4 *
5 * SPDX-License-Identifier: Apache-2.0
6 *
7 * ***
8 */
9
10/* === Modules === */
11
12/* === Re-Exports === */
13
14/* === Imports === */
15
16// Standard Library Imports
17
18// Third Party Imports
19
20// Local Imports
21use harmos_domain::{MemorySize, schema::Described};
22
23/* === Constants === */
24
25/* === Macros === */
26
27harmos_domain::postcard_product!(Initialize { config_json: Vec<u8>, generation_context: Vec<u8>, assignments: Vec<u8> });
28
29/* === Type Aliases === */
30
31/* === Structs === */
32
33#[harmos::operation(harmos_path = crate, codec = manual, id = "harmos.initialize", response = (), policy = super::POLICY, )]
34#[derive(Clone, PartialEq, Debug, Default)]
35pub struct Initialize {
36    pub config_json: Vec<u8>,
37    pub generation_context: Vec<u8>,
38    pub assignments: Vec<u8>,
39}
40
41#[cfg(feature = "lifecycle")]
42pub struct Control {
43    #[cfg(feature = "lifecycle")]
44    instance: Box<dyn harmos_sdk::operations::lifecycle::LifecycleInstance>,
45}
46
47/* === Enums === */
48
49#[cfg(feature = "lifecycle")]
50#[derive(Debug, thiserror::Error)]
51pub enum ControlError {
52    #[error(transparent)]
53    Dependency(#[from] harmos_sdk::ResourceError),
54
55    #[error("plugin lifecycle access failed: {0}")]
56    Access(#[source] harmos_sdk::operations::access::AccessError),
57}
58
59/* === Traits === */
60
61/* === Implementations === */
62
63impl Described for Initialize {
64    const NAME: &'static str = <harmos_domain::model::operations::lifecycle::InitializationSchema as Described>::NAME;
65    const FIELDS: &'static [harmos_domain::schema::declaration::Field] =
66        <harmos_domain::model::operations::lifecycle::InitializationSchema as Described>::FIELDS;
67    const MARKER: &'static [u8] = <harmos_domain::model::operations::lifecycle::InitializationSchema as Described>::MARKER;
68}
69
70impl MemorySize for Initialize {
71    fn memory_size(&self) -> usize {
72        std::mem::size_of::<Self>()
73            .saturating_add(self.config_json.capacity())
74            .saturating_add(self.generation_context.capacity())
75            .saturating_add(self.assignments.capacity())
76    }
77}
78
79#[cfg(feature = "lifecycle")]
80impl harmos_sdk::operations::Carrier for Control {
81    type Declaration = Initialize;
82    type Error = super::ControlError;
83    type StreamEndpoints = ();
84    async fn bind(context: crate::ExecutionContext) -> Result<Self, Self::Error> {
85        let access = context.resource::<harmos_sdk::operations::lifecycle::LifecycleAccess>()?;
86        Ok(Self {
87            instance: access.0.clone().begin(super::Action::Initialize),
88        })
89    }
90    async fn attempt(
91        &mut self, context: crate::ExecutionContext, request: &mut Initialize, _: &mut (),
92    ) -> Result<crate::Response<()>, Self::Error> {
93        let _ = &request;
94        self.instance
95            .run(context, &request.config_json, &request.generation_context, &request.assignments)
96            .await
97            .map_err(super::ControlError::Access)?;
98        Ok(().into())
99    }
100    async fn cleanup(&mut self) -> Result<(), Self::Error> {
101        self.instance.cleanup().await.map_err(super::ControlError::Access)
102    }
103}
104
105#[cfg(feature = "lifecycle")]
106impl crate::Executable for Initialize {
107    type Carrier = Control;
108}
109
110/* === Public Functions === */
111
112/* === Private Functions === */
113
114/* === Tests === */