use anyhow::Result;
use std::path::Path;
use crate::state::{load_friends, save_friends};
pub fn add(home: &Path, name: &str, pubkey: &str) -> Result<()> {
if pubkey.len() != 43 {
anyhow::bail!(
"pubkey looks wrong (expected 43 chars base64url-no-pad, got {})",
pubkey.len()
);
}
let mut friends = load_friends(home).unwrap_or_default();
friends.by_name.insert(name.to_string(), pubkey.to_string());
save_friends(home, &friends)?;
println!("added: {name} -> {pubkey}");
Ok(())
}
pub fn list(home: &Path) -> Result<()> {
let friends = load_friends(home).unwrap_or_default();
if friends.by_name.is_empty() {
println!("(no friends configured)");
return Ok(());
}
let mut entries: Vec<_> = friends.by_name.iter().collect();
entries.sort_by(|a, b| a.0.cmp(b.0));
for (name, pk) in entries {
println!("{name:<16} {pk}");
}
Ok(())
}
pub fn remove(home: &Path, name: &str) -> Result<()> {
let mut friends = load_friends(home).unwrap_or_default();
if friends.by_name.remove(name).is_some() {
save_friends(home, &friends)?;
println!("removed: {name}");
} else {
println!("no friend named {name}");
}
Ok(())
}