use clientele::{
StandardOptions,
SysexitsError::{self, *},
crates::clap::{Parser, Subcommand},
};
use core::str::FromStr;
use derive_more::FromStrError;
use edky::{PUBLIC_KEY_FORMATS, PublicKeyBytes, PublicKeyEncoding};
#[derive(Debug, Parser)]
#[command(name = "Edky", long_about)]
#[command(arg_required_else_help = true)]
struct Options {
#[clap(flatten)]
flags: StandardOptions,
#[command(subcommand)]
command: Option<Command>,
}
#[derive(Debug, Subcommand)]
enum Command {
List {},
Convert {
#[clap(long, short, default_value = "hex", value_parser = parse_format)]
from: PublicKeyEncoding,
#[clap(long, short, default_value = "hex", value_parser = parse_format)]
to: PublicKeyEncoding,
inputs: Vec<String>,
},
Parse {
#[clap(long, short, default_value = "hex", value_parser = parse_format)]
from: PublicKeyEncoding,
inputs: Vec<String>,
},
}
pub fn main() -> Result<(), SysexitsError> {
clientele::dotenv().ok();
let args = clientele::args_os()?;
let options = Options::parse_from(args);
if options.flags.version {
println!("edky {}", env!("CARGO_PKG_VERSION"));
return Ok(());
}
if options.flags.license {
print!("{}", include_str!("../UNLICENSE"));
return Ok(());
}
if options.flags.debug {}
match options.command.unwrap() {
Command::List {} => {
for format in PUBLIC_KEY_FORMATS {
println!("{}", format.name());
}
Ok(())
},
Command::Convert { from, to, inputs } => {
for input in inputs {
let key = PublicKeyBytes::decode(from, input)?;
let Some(encoded) = key.encode(to) else {
return Err(EX_CONFIG);
};
println!("{}", encoded);
}
Ok(())
},
Command::Parse { from, inputs } => {
for input in inputs {
let _ = PublicKeyBytes::decode(from, input)?;
}
println!("OK");
Ok(())
},
}
}
fn parse_format(input: &str) -> Result<PublicKeyEncoding, FromStrError> {
for format in PUBLIC_KEY_FORMATS {
if format.name() == input {
return Ok(format.encoding());
}
}
PublicKeyEncoding::from_str(input)
}