kxfides 0.1.0

CLI for signing & verifying media with KX-Fides.
// cli/src/cmd_keygen.rs

use anyhow::{bail, Context, Result};
use owo_colors::OwoColorize;
use std::fs;
use std::path::Path;

use kx_fides_core::keys::{generate_ed25519, save_keypair};

use super::KeygenArgs;

pub fn run(args: KeygenArgs) -> Result<()> {
    let out_path = args.out;
    let out_display = out_path.display();

    // Ensure parent directory exists (if any)
    if let Some(parent) = out_path.parent() {
        if !parent.as_os_str().is_empty() && !parent.exists() {
            fs::create_dir_all(parent)
                .with_context(|| format!("failed to create directories for {}", parent.display()))?;
        }
    }

    // Refuse to overwrite an existing file
    if Path::new(&out_path).exists() {
        bail!("refusing to overwrite existing file: {}", out_display);
    }

    // Generate keypair
    let kp = generate_ed25519().context("failed to generate Ed25519 keypair")?;

    // Save to disk (pretty JSON)
    save_keypair(out_path.to_str().unwrap(), &kp)
        .with_context(|| format!("failed to write keypair to {}", out_display))?;

    // Success message
    println!(
        "{} {}",
        "✓ generated keypair →".green().bold(),
        out_display
    );
    println!(
        "{} {}",
        "public key (base64):".cyan(),
        kp.public_key
    );

    Ok(())
}