Add subcommands
This commit is contained in:
		
							
								
								
									
										60
									
								
								src/main.rs
									
									
									
									
									
								
							
							
						
						
									
										60
									
								
								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()); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user