Skip to main content

made_core/value_objects/ceremony/
context_writes.rs

1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::error::DomainError;
6
7use super::{ContextKey, ContextPatch, StepOutput, StepOutputField};
8
9/// Declared copies from top-level step output fields into ceremony context.
10#[derive(Debug, Clone, Default, PartialEq, Eq, Serialize, Deserialize)]
11#[serde(transparent)]
12pub struct ContextWrites(BTreeMap<ContextKey, StepOutputField>);
13
14impl ContextWrites {
15    #[must_use]
16    pub fn new(entries: BTreeMap<ContextKey, StepOutputField>) -> Self {
17        Self(entries)
18    }
19
20    #[must_use]
21    pub fn is_empty(&self) -> bool {
22        self.0.is_empty()
23    }
24
25    #[must_use]
26    pub fn entries(&self) -> &BTreeMap<ContextKey, StepOutputField> {
27        &self.0
28    }
29
30    pub fn resolve(&self, output: &StepOutput) -> Result<Option<ContextPatch>, DomainError> {
31        if self.is_empty() {
32            return Ok(None);
33        }
34        let mut patch = BTreeMap::new();
35        for (destination, source) in &self.0 {
36            let value = output
37                .attributes()
38                .get(source.as_str())
39                .ok_or(DomainError::NotFound {
40                    what: "ceremony_step.context_write.output_field",
41                })?;
42            patch.insert(destination.clone(), value.clone());
43        }
44        Ok(Some(ContextPatch::new(patch)?))
45    }
46}