use std::collections::HashMap;
use bonds_cli::ui;
use bonds_core::{BondError, BondManager};
pub fn cmd_metadata_get(
manager: &BondManager,
id: &str,
key: Option<&str>,
) -> Result<(), BondError> {
let bond = manager.get_bond(id)?;
match key {
Some(k) => {
let value = bond
.metadata()
.and_then(|m| m.get(k))
.ok_or_else(|| BondError::NotFound(format!("metadata key not found: {k}")))?;
ui::title("Metadata:");
ui::subheading(format!(" {k}:"));
ui::dim(format!(" {value}"));
}
None => {
let Some(meta) = bond.metadata() else {
ui::warning("No metadata set for this bond.");
return Ok(());
};
if meta.is_empty() {
ui::warning("No metadata set for this bond.");
return Ok(());
}
let mut entries: Vec<(&String, &String)> = meta.iter().collect();
entries.sort_by(|a, b| a.0.cmp(b.0));
ui::heading("Metadata:");
for (k, v) in entries {
ui::subheading(format!(" {k}:"));
ui::dim(format!(" {v}"));
}
}
}
Ok(())
}
pub fn cmd_metadata_set(
manager: &BondManager,
id: &str,
key: &str,
value: &str,
) -> Result<(), BondError> {
let bond = manager.get_bond(id)?;
let mut metadata: HashMap<String, String> = bond.metadata().cloned().unwrap_or_default();
metadata.insert(key.to_string(), value.to_string());
let updated = manager.update_bond_metadata(bond.id(), Some(metadata))?;
ui::status_ok("✓ SUCCESS");
ui::success("Metadata updated for bond:");
ui::id(format!(" {}", &updated.id()[..8]));
ui::subheading(format!(" {key}:"));
ui::dim(format!(" {value}"));
Ok(())
}
pub fn cmd_metadata_remove(manager: &BondManager, id: &str, key: &str) -> Result<(), BondError> {
let bond = manager.get_bond(id)?;
let mut metadata = bond
.metadata()
.cloned()
.ok_or_else(|| BondError::NotFound(format!("metadata key not found: {key}")))?;
if metadata.remove(key).is_none() {
return Err(BondError::NotFound(format!(
"metadata key not found: {key}"
)));
}
let next = if metadata.is_empty() {
None
} else {
Some(metadata)
};
let updated = manager.update_bond_metadata(bond.id(), next)?;
ui::status_ok("✓ SUCCESS");
ui::success("Metadata key removed for bond:");
ui::id(format!(" {}", &updated.id()[..8]));
ui::subheading(format!(" removed key: {key}"));
Ok(())
}