1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
use galm;

// Cargo.toml のバージョン
const VERSIONSTR: &'static str = env!("CARGO_PKG_VERSION");

// --help で表示する文言
const HELPSTR: &'static str = r"Usage:
    galm [-f | --file (<file_path> | <string>)]
         [-h | --help] [-v | --version]
Options:
    -f --file           file path.
    -h --help           Show this message.
    -v --version        Show version number.";

// 似ているパラメータ名を表示する
fn get_similar_param(input_param: &str) -> &str {
    use galm::search::Iterator;
    return [
        "-f", "--file",
        "-h", "--help",
        "-v", "--version"
    ].iter().get_similar_word(input_param);
}

// Vectorの中身を表示する
fn print_vec(vec: &Vec<&str>) {
    use std::io::{stdout, Write, BufWriter};
    let out = stdout();
    let mut out = BufWriter::new(out.lock());
    for word in vec {
        out.write_all(word.as_bytes()).unwrap();
        out.write_all(b"\n").unwrap();
    }
}

// main
fn main() {

    // 翻訳対象を読み込み
    let args: Vec<String> = std::env::args().collect();

    // --version もしくは --help が指定されていた場合は、他のオプションに関係なく出力
    // また、両方指定されている場合は、先に指定されていた方を優先して出力
    for arg in args.iter() {
        match &*arg.to_string() {

            // print version
            "-v" | "--version" => {
                println!("galm version {}", VERSIONSTR);
                return;
            },

            // print help
            "-h" | "--help" => {
                println!("{}", HELPSTR);
                return;
            },
            _ => {}
        }
    }

    match args.len() {
        1 => {
            // 引数が指定されていない場合は --help を出力
            println!("{}", HELPSTR);
            return;
        },
        2 => {

            use std::io::{self, Read};
            let stdin = io::stdin();
            let mut handle = stdin.lock();
            let mut buffer = String::new();
            let _ = handle.read_to_string(&mut buffer);

            // initialize galm
            let galm = galm::new();

            // sort
            let sort_key = &*args[1];
            let mut vec = buffer.lines().collect::<Vec<&str>>();
            vec.sort_by_cached_key( |candidate| galm.get_word_distance(sort_key, candidate) );

            // print
            print_vec(&vec);
            return;
        },
        _ => {}
    }

    // 各処理
    match &*args[2] {
        "-f" | "--file" => {
            if args.len() > 3 {

                use std::fs::File;
                use std::io::prelude::*;
                let mut file = File::open(&*args[3]).unwrap();
                let mut buffer = String::new();
                let _ = file.read_to_string(&mut buffer);

                // initialize galm
                let galm = galm::new();

                // sort
                let sort_key = &*args[1];
                let mut vec = buffer.lines().collect::<Vec<&str>>();
                vec.sort_by_cached_key( |candidate| galm.get_word_distance(sort_key, candidate) );

                // print
                print_vec(&vec);
            } else {
                println!(r"Error:
    filepath is not specified.");
            }
        },
        arg => {
            println!(r"Error:
    not exists option: `{}`
    most similar param name: `{}`
    try 'galm --help' for more information",
                arg,
                get_similar_param(arg));
        }
    }
}