use provable_contracts_macros::contract;
use std::collections::HashMap;
use super::types::RecipeMetadata;
pub(crate) use super::validation_types::validate_input_type;
#[cfg(test)]
pub(crate) use super::validation_types::validate_int;
#[contract("recipe-determinism-v1", equation = "validate_inputs")]
pub fn validate_inputs(
recipe: &RecipeMetadata,
provided: &HashMap<String, serde_yaml_ng::Value>,
) -> Result<HashMap<String, String>, String> {
if recipe.inputs.is_empty() {
let _ = provided; return Ok(HashMap::new());
}
contract_pre_validate_inputs!(recipe.inputs);
let mut resolved = HashMap::new();
for (name, decl) in &recipe.inputs {
let value = if let Some(v) = provided.get(name) {
v.clone()
} else if let Some(ref default) = decl.default {
default.clone()
} else {
return Err(format!(
"recipe '{}' requires input '{}' (type: {})",
recipe.name, name, decl.input_type
));
};
let string_val = validate_input_type(name, &decl.input_type, &value, decl)?;
resolved.insert(name.clone(), string_val);
}
Ok(resolved)
}