use std::env;
use std::fs::File;
use std::io::Read;
use std::io::Write;
use std::path::Path;
use std::string::String;
fn make_wordlist(contents: &str) -> Vec<&str> {
contents
.split('\n')
.skip(2)
.take(7776)
.map(|s| s.split_once('\t').unwrap().1)
.collect()
}
fn make_minilock_wordlist(contents: &str) -> Vec<&str> {
(&contents[1023..543718]).split(',').collect()
}
fn make_beale_struct(wordlist: Vec<&str>) -> std::string::String {
let mut output = std::string::String::new();
output.push_str("static BEALE_WORDLIST: [BealeWord; 7776] = [\n");
for word in wordlist {
output.push_str(" BealeWord(\"");
for c in word.chars() {
if c == '"' {
output.push_str("\\\"");
} else {
output.push(c);
}
}
output.push_str("\"),\n");
}
output.push_str("];\n");
output
}
fn make_reinhold_struct(wordlist: Vec<&str>) -> std::string::String {
let mut output = std::string::String::new();
output.push_str("static REINHOLD_WORDLIST: [ReinholdWord; 7776] = [\n");
for word in wordlist {
output.push_str(" ReinholdWord(\"");
for c in word.chars() {
if c == '"' {
output.push_str("\\\"");
} else {
output.push(c);
}
}
output.push_str("\"),\n");
}
output.push_str("];\n");
output
}
fn make_minilock_struct(wordlist: Vec<&str>) -> std::string::String {
let mut output = std::string::String::new();
output.push_str("static MINILOCK_WORDLIST: [MiniLockWord; 58110] = [\n");
for word in wordlist {
output.push_str(" MiniLockWord(\"");
for c in word.chars() {
if c == '"' {
panic!("Not supposed to have any double quotes.");
} else {
output.push(c);
}
}
output.push_str("\"),\n");
}
output.push_str("];\n");
output
}
fn main() {
let manifest_dir = env::var("CARGO_MANIFEST_DIR").unwrap();
println!("{}", manifest_dir);
let wordlists_dir = Path::new(&manifest_dir).join("bin").join("wordlists");
let mut beale_wordlist_file = File::open(&wordlists_dir.join("beale.wordlist.asc")).unwrap();
let mut reinhold_wordlist_file =
File::open(&wordlists_dir.join("diceware.wordlist.asc")).unwrap();
let mut minilock_wordlist_file = File::open(&wordlists_dir.join("phrase.js")).unwrap();
let mut beale_wordlist_string = String::new();
let mut reinhold_wordlist_string = String::new();
let mut minilock_wordlist_string = String::new();
beale_wordlist_file
.read_to_string(&mut beale_wordlist_string)
.unwrap();
reinhold_wordlist_file
.read_to_string(&mut reinhold_wordlist_string)
.unwrap();
minilock_wordlist_file
.read_to_string(&mut minilock_wordlist_string)
.unwrap();
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("diceware.rs");
let mut f = File::create(&dest_path).unwrap();
f.write_all(make_beale_struct(make_wordlist(&beale_wordlist_string)).as_bytes())
.unwrap();
f.write_all(make_reinhold_struct(make_wordlist(&reinhold_wordlist_string)).as_bytes())
.unwrap();
f.write_all(make_minilock_struct(make_minilock_wordlist(&minilock_wordlist_string)).as_bytes())
.unwrap();
}