use std::io::{self, BufRead};
use std::{env, fs, path::Path};
fn main() {
let mut dicionary_output = String::from("");
let mut keywords_array_string = String::from(
"#[allow(dead_code)]
static KEYWORDS: [&str; ",
);
let mut whois_servers_string = String::from(
"#[allow(dead_code)]
static WHOIS_RAW_JSON: &str = r#",
);
match read_lines("./data/keywords.txt") {
Ok(lines) => {
let tlds = lines.map(|l| l.unwrap()).collect::<Vec<String>>();
keywords_array_string.push_str(&tlds.len().to_string());
keywords_array_string.push_str("] = [\r\n");
for line in tlds.into_iter() {
keywords_array_string.push_str("\u{20}\u{20}\u{20}\u{20}\"");
let tld = if line.chars().all(char::is_alphanumeric) {
line.to_string()
} else {
punycode::encode(line.to_string().as_str()).unwrap()
};
keywords_array_string.push_str(&tld[..]);
keywords_array_string.push_str("\",\r\n");
}
keywords_array_string.push_str("];\r\n");
}
Err(e) => panic!(
"{}",
format!(
"unable to build library due to missing dictionary file(s): {}",
e
)
),
}
match read_lines("./data/whois-servers.json") {
Ok(lines) => {
whois_servers_string.push('"');
lines.for_each(|l| whois_servers_string.push_str(&l.unwrap()));
whois_servers_string.push_str("\"#;");
}
Err(e) => panic!(
"{}",
format!(
"unable to build library due to missing dictionary file(s): {}",
e
)
),
}
dicionary_output.push_str(&keywords_array_string);
dicionary_output.push('\n');
dicionary_output.push_str(&whois_servers_string);
let out_dir = env::var("OUT_DIR").unwrap();
let dest_path = Path::new(&out_dir).join("data.rs");
fs::write(dest_path, dicionary_output).unwrap();
}
fn read_lines<P>(filename: P) -> io::Result<io::Lines<io::BufReader<fs::File>>>
where
P: AsRef<Path>,
{
let file = fs::File::open(filename)?;
Ok(io::BufReader::new(file).lines())
}