extern crate getopts;
#[macro_use] extern crate log;
extern crate simple_logger;
extern crate igo;
use std::path::PathBuf;
use std::io::{Write};
use std::fs;
use getopts::Options;
use std::env;
use std::time::Instant;
use igo::dictionary::build::*;
fn print_usage(program: &str, opts: Options) {
println!("{}", opts.usage(&format!(
"Usage:\n {} [options] <output directory> <input directory> <encoding>", program)));
}
fn build_dic_cli() -> AppResult<i32> {
let args: Vec<String> = env::args().collect();
let program = args[0].clone();
let mut opts = Options::new();
opts.optopt("d", "delimiter", "set delimiter to STR.", "STR");
opts.optflag("v", "verbose", "enable verbose mode.");
opts.optflag("", "help", "show this usage message.");
let matches = match opts.parse(&args[1..]) {
Ok(m) => { m }
Err(_) => {
print_usage(&program, opts);
return Ok(1);
}
};
if matches.opt_present("help") {
print_usage(&program, opts);
return Ok(1);
}
if matches.opt_present("verbose") {
simple_logger::init().unwrap();
}
let delimiter = matches.opt_str("d").unwrap_or(",".to_string());
let mut args = matches.free.into_iter();
let output_dir = if let Some(s) = args.next() {
PathBuf::from(s)
} else {
print_usage(&program, opts);
return Ok(1)
};
let input_dir = if let Some(s) = args.next() {
PathBuf::from(s)
} else {
print_usage(&program, opts);
return Ok(1)
};
let encoding = if let Some(s) = args.next() {
s
} else {
print_usage(&program, opts);
return Ok(1)
};
info!("output_dir: {}, input_dir: {}, delimiter: {}",
output_dir.display(), input_dir.display(), delimiter);
fs::create_dir_all(&output_dir).expect("couldn't create directory");
let start_time = Instant::now();
let mut wd = WordDic::new(&input_dir, &encoding, &output_dir, delimiter);
let cc = CharCategory::new(&input_dir, &encoding, &output_dir);
println!("### Build word trie");
wd.build_word_id_map()?;
println!("### Build word dictionary");
wd.build_word_info()?;
println!("### Build matrix");
matrix::build(&input_dir, &output_dir)?;
println!("### Build char-category dictionary");
cc.build()?;
let elapsed = start_time.elapsed();
let ms = ((elapsed.as_secs() as f64) * 1000.0)
+ ((elapsed.subsec_nanos() as f64) / 1_000_000.0);
println!("DONE");
println!("elapsed: {} ms", ms);
Ok(0)
}
fn main() {
match build_dic_cli() {
Ok(exit_code) => std::process::exit(exit_code),
Err(error) => writeln!(std::io::stderr(), "Error: {}", error).unwrap()
}
}