From 667d881750784dff74566a810947fe3774e5b10b Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 25 May 2019 23:14:00 -0400 Subject: [PATCH] generate function --- Cargo.toml | 1 + src/main.rs | 49 ++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 49 insertions(+), 1 deletion(-) diff --git a/Cargo.toml b/Cargo.toml index 3de7d28..c8cabdc 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -11,3 +11,4 @@ docopt = "1.1.0" serde = "1.0.91" log = "0.4.6" pretty_env_logger = "0.3.0" +rand = "0.6.5" diff --git a/src/main.rs b/src/main.rs index e533484..0342ec1 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,6 +1,10 @@ use docopt::Docopt; +use log::debug; +use rand::rngs::OsRng; +use rand::seq::IteratorRandom; +use rand::seq::SliceRandom; use serde::Deserialize; -use log::{debug}; +use std::iter::FromIterator; static USAGE: &'static str = " foil @@ -28,6 +32,45 @@ struct Args { arg_spec: Option, } +fn generate(spec: &str) { + let (len, rest) = { + let mut separated = spec.splitn(2, ","); + let len = separated.next().unwrap(); + let rest = separated.next().unwrap(); + (len, rest) + }; + let mut rnd = OsRng::new().unwrap(); + + let mut password_vec: Vec = rest + .chars() + .cycle() + .map(|c| match c { + 'a' => "abcdefghijklmnopqrstuvwxyz" + .chars() + .choose(&mut rnd) + .expect("Could not get random element"), + 'A' => "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + .chars() + .choose(&mut rnd) + .expect("Could not get random element"), + '1' => "1234567890" + .chars() + .choose(&mut rnd) + .expect("Could not get random element"), + '.' => ".,/?-=#%^" + .chars() + .choose(&mut rnd) + .expect("Could not get random element"), + _ => panic!("Unknown character spec: {}", c), + }) + .take(len.parse().unwrap()) + .collect(); + + password_vec.shuffle(&mut rnd); + let shuffled: String = String::from_iter(password_vec.into_iter()); + println!("{}", shuffled); +} + fn main() { pretty_env_logger::init(); let args: Args = Docopt::new(USAGE) @@ -35,4 +78,8 @@ fn main() { .unwrap_or_else(|e| e.exit()); debug!("{:?}", args); + if args.cmd_generate { + generate(&args.arg_spec.unwrap()); + return; + } }