From 7022351ee73c7467d6b8a08563513f3803ecb489 Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Mon, 27 May 2019 19:24:36 -0400 Subject: [PATCH] move password generation off to its own file --- src/generate.rs | 43 +++++++++++++++++++++++++++++++++++++++++++ src/main.rs | 46 ++-------------------------------------------- 2 files changed, 45 insertions(+), 44 deletions(-) create mode 100644 src/generate.rs diff --git a/src/generate.rs b/src/generate.rs new file mode 100644 index 0000000..2c27c11 --- /dev/null +++ b/src/generate.rs @@ -0,0 +1,43 @@ +use rand::rngs::OsRng; +use rand::seq::IteratorRandom; +use rand::seq::SliceRandom; +use std::iter::FromIterator; + +pub 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); +} diff --git a/src/main.rs b/src/main.rs index 27fc229..faad663 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,13 +1,10 @@ use docopt::Docopt; use log::debug; -use rand::rngs::OsRng; -use rand::seq::IteratorRandom; -use rand::seq::SliceRandom; use serde::Deserialize; use std::error::Error; -use std::iter::FromIterator; pub mod db; +pub mod generate; static USAGE: &'static str = " foil @@ -35,45 +32,6 @@ 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() -> Result<(), Box> { pretty_env_logger::init(); let args: Args = Docopt::new(USAGE) @@ -82,7 +40,7 @@ fn main() -> Result<(), Box> { debug!("{:?}", args); if args.cmd_generate { - generate(&args.arg_spec.unwrap()); + generate::generate(&args.arg_spec.unwrap()); return Ok(()); }