sdf-metadata 0.14.0

metadata definition for core sdf
Documentation
use std::collections::BTreeMap;

use anyhow::{anyhow, Result};

use crate::wit::{operator::StepState, states::State};

pub fn inject_states(
    service_states: &mut BTreeMap<String, State>,
    step_states: &[StepState],
) -> Result<()> {
    for state in step_states {
        match state {
            StepState::Resolved(s) => {
                let state = State::Typed(s.clone());

                if let Some(old_state_def) = service_states.insert(s.name.clone(), state.clone()) {
                    if old_state_def != state {
                        return Err(anyhow!("state {} is already defined", s.name));
                    }
                }
            }
            StepState::Unresolved(s) => {
                return Err(anyhow!("state {} is not resolved", s.name));
            }
        }
    }

    Ok(())
}

#[cfg(test)]
mod test {

    #[test]
    fn test_inject_states() {
        let mut service_states = std::collections::BTreeMap::new();
        let step_states = vec![crate::wit::operator::StepState::Resolved(
            crate::wit::states::StateTyped {
                name: "state".to_string(),
                type_: crate::wit::metadata::SdfKeyedState {
                    key: crate::wit::metadata::TypeRef {
                        name: "string".to_string(),
                    },
                    value: crate::wit::metadata::SdfKeyedStateValue::Unresolved(
                        crate::wit::metadata::TypeRef {
                            name: "my-state-value".to_string(),
                        },
                    ),
                },
            },
        )];

        assert!(service_states.is_empty());

        let result = crate::importer::states::inject_states(&mut service_states, &step_states);
        assert!(result.is_ok());

        assert_eq!(service_states.len(), 1);
    }
}