use crate::word_list::*;
use crate::Generator;
use argh::*;
enum WordList {
English(),
Italian(),
CV(),
}
impl FromArgValue for WordList {
fn from_arg_value(value: &str) -> Result<Self, String> {
match value {
"italian" => Ok(WordList::Italian()),
"eff" => Ok(WordList::English()),
"cv" => Ok(WordList::CV()),
_ => Err("non existant word list, use one of [italian, cv, eff].".to_string()),
}
}
}
#[derive(FromArgs)]
struct Cli {
#[argh(option, short = 'p', default = "String::from(\"w-c-s-d\")")]
pattern: String,
#[argh(option, short = 'n', default = "5")]
num: usize,
#[argh(option, short = 'd', default = "3")]
depth: usize,
#[argh(option, short = 's', default = "WordList::English()")]
style: WordList,
}
pub fn cli_main() {
let args: Cli = argh::from_env();
let mut generator = Generator::new_custom(
match args.style {
WordList::English() => eff::list(),
WordList::Italian() => italian::list(),
WordList::CV() => cv::list(),
},
args.depth,
)
.unwrap();
println!(
"{:10} {:15} {}",
" n.", " log2(guesses)", "secret"
);
for i in 0..args.num {
let (passphrase, pass_entropy) = generator.gen_from_pattern(&args.pattern);
println!(
"{:10} {:15.2} {}",
i + 1,
pass_entropy - 1.0,
passphrase
);
}
}