Skip to main content

aprender_contracts_cli/commands/
unlock.rs

1use std::path::Path;
2
3pub fn run(contract: &Path, reason: &str) -> Result<(), Box<dyn std::error::Error>> {
4    let content = std::fs::read_to_string(contract)?;
5
6    // Parse to verify it's valid
7    let mut contract_obj: serde_yaml::Value = serde_yaml::from_str(&content)?;
8
9    // Remove locked_level from metadata
10    if let Some(metadata) = contract_obj.get_mut("metadata") {
11        if let Some(map) = metadata.as_mapping_mut() {
12            let had_lock = map.remove("locked_level");
13            if had_lock.is_none() {
14                println!("Contract has no locked_level -- nothing to unlock.");
15                return Ok(());
16            }
17        }
18    }
19
20    // Write back
21    let new_content = serde_yaml::to_string(&contract_obj)?;
22    std::fs::write(contract, &new_content)?;
23
24    println!("Unlocked: {}", contract.display());
25    println!("Reason: {reason}");
26    println!("Warning: The contract can now regress below its previous locked level.");
27
28    Ok(())
29}