igo-rs 0.2.2

Pure Rust port of the Igo, a POS(Part-Of-Speech) tagger for Japanese (日本語 形態素解析).
Documentation
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()
    }
}