made_core/value_objects/ceremony/
context_writes.rs1use std::collections::BTreeMap;
2
3use serde::{Deserialize, Serialize};
4
5use crate::error::DomainError;
6
7use super::{ContextKey, ContextPatch, StepOutput, StepOutputField};
8
9#[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}