#[macro_use] extern crate clap; extern crate dirs; extern crate ring; extern crate serde_json; use clap::{App, Arg}; use ring::rand::SystemRandom; use ring::signature::Ed25519KeyPair; use std::error; use std::fs::{self, File}; use std::io::Write; use std::path::Path; fn main() -> Result<(), Box> { let matches = App::new("solana-keygen") .version(crate_version!()) .arg( Arg::with_name("outfile") .short("o") .long("outfile") .value_name("PATH") .takes_value(true) .help("path to generated file"), ) .get_matches(); let rnd = SystemRandom::new(); let pkcs8_bytes = Ed25519KeyPair::generate_pkcs8(&rnd)?; let serialized = serde_json::to_string(&pkcs8_bytes.to_vec())?; let mut path = dirs::home_dir().expect("home directory"); let outfile = if matches.is_present("outfile") { matches.value_of("outfile").unwrap() } else { path.extend(&[".config", "solana", "id.json"]); path.to_str().unwrap() }; if outfile == "-" { println!("{}", serialized); } else { if let Some(outdir) = Path::new(outfile).parent() { fs::create_dir_all(outdir)?; } let mut f = File::create(outfile)?; f.write_all(&serialized.into_bytes())?; } Ok(()) }