diff --git a/src/main.rs b/src/main.rs index 4e092bf..0c84471 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,7 +1,7 @@ use std::time::{SystemTime, UNIX_EPOCH}; use base32::Alphabet; -use clap::Parser; +use clap::{Parser, Subcommand}; use totp_rfc6238::{HashAlgorithm, TotpGenerator}; /// Get the current time since epoch @@ -14,36 +14,50 @@ pub fn time() -> u64 { #[derive(Parser, Debug)] #[clap(author, version, about, long_about = None)] struct Args { - /// The secret to use - #[clap(short, long)] - secret: String, + #[clap(subcommand)] + command: SubCommands +} - /// Interval between two numbers generation - #[clap(short, long, default_value_t = 30)] - topt_step: u64, +#[derive(Subcommand, Debug)] +enum SubCommands { + /// Get a code + #[clap(arg_required_else_help = true)] + Code { + /// The secret to use + #[clap(short, long)] + secret: String, - /// Size of generated secret - #[clap(short, long, default_value_t = 6)] - len: usize, + /// Interval between two numbers generation + #[clap(short, long, default_value_t = 30)] + topt_step: u64, + + /// Size of generated secret + #[clap(short, long, default_value_t = 6)] + len: usize, + } } fn main() { let args: Args = Args::parse(); - let totp_generator = TotpGenerator::new() - .set_digit(args.len).unwrap() - .set_step(args.topt_step).unwrap() - .set_hash_algorithm(HashAlgorithm::SHA1) - .build(); + match args.command { + SubCommands::Code { secret, topt_step, len } => { + let totp_generator = TotpGenerator::new() + .set_digit(len).unwrap() + .set_step(topt_step).unwrap() + .set_hash_algorithm(HashAlgorithm::SHA1) + .build(); - let key = base32::decode( - Alphabet::RFC4648 { padding: true }, - &args.secret, - ).unwrap(); + let key = base32::decode( + Alphabet::RFC4648 { padding: true }, + &secret, + ).unwrap(); - let code = totp_generator.get_code(&key); - let next_update = totp_generator.get_next_update_time().unwrap(); + let code = totp_generator.get_code(&key); + let next_update = totp_generator.get_next_update_time().unwrap(); - println!("Secret = {}", code); - println!("Next update = {} seconds", next_update - time()); + println!("Secret = {}", code); + println!("Next update = {} seconds", next_update - time()); + } + } }