use std::io::Write;
use std::path::PathBuf;
use clap::Args;
use pointbreak::keys::generate_key;
use crate::cli::{json, output};
#[derive(Debug, Args)]
pub(super) struct InitArgs {
#[arg(long, default_value = "default")]
name: String,
#[command(flatten)]
format_args: output::FormatArgs,
}
#[derive(serde::Serialize)]
#[serde(rename_all = "camelCase")]
struct InitBody {
name: String,
did_key: String,
path: PathBuf,
}
pub(super) fn run(
args: InitArgs,
stdout: &mut dyn Write,
) -> Result<(), Box<dyn std::error::Error>> {
let handle = generate_key(&args.name)?;
let body = InitBody {
name: args.name,
did_key: handle.signer_id().as_str().to_owned(),
path: handle.private_key_path().to_owned(),
};
let format = output::resolve_format(args.format_args.explicit(), output::OutputFormat::Json)?;
let text =
matches!(format.format, output::OutputFormat::Text).then(|| render_key_init_text(&body));
let document = json::DiagnosticDocument::new("pointbreak.key-init", body, vec![]);
output::write_document(stdout, format, &document, || {
text.expect("text lane resolves the digest source")
})
}
fn render_key_init_text(body: &InitBody) -> String {
format!(
"created key \"{}\" · {} · {}",
body.name,
body.did_key,
body.path.display()
)
}