harmos_operations/lifecycle/
initialize.rs1use harmos_domain::{MemorySize, schema::Described};
22
23harmos_domain::postcard_product!(Initialize { config_json: Vec<u8>, generation_context: Vec<u8>, assignments: Vec<u8> });
28
29#[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#[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
59impl 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