parley-md 0.1.2

Reference CLI for the Parley agent-to-agent messaging protocol. Installs the `parley` binary.
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(())
}