clap(CLI API)のyaml指定

[clap](https://github.com/clap-rs/clap#using-yaml)には、YAMLを使ってコマンドラインオプション定義を行う機能があるので試してみた。

```toml:Cargo.toml(抜粋)
[dependencies]
clap = {version = "~2.33.3", features = ["yaml"]}
```

```rust:src/main.rs
#[macro_use]
extern crate clap;
use clap::App;

fn main() {
    let yaml = load_yaml!("cli.yml");
    let matches = App::from_yaml(yaml).get_matches();

    if let Some(filename) = matches.value_of("file") {
        println!("Value for --file: {}", filename);
    }
}
```

いきなり巨大な定義ファイルを作っても、paeseに失敗したときに原因解明に手間取る。少しづつ定義を足していく。

```yaml:src/cli.yml
name: perg
varsion: "1.0.0"
author: kencoba <ken.coba@gmail.com>
about: Grep comman line option sample
args:
    - help:
        long: help
    - version:
        short: V
        long: version
    - extended-regexp:
        short: E
        long: extended-regexp
    - fixed-strings:
        short: F
        long: fixed-strings
    - basic-regexp:
        short: G
        long: basic-regexp
    - perl-regexp:
        short: P
        long: perl-regexp
    - regexp:
        short: e
        long: regexp
        value_name: PATTERN
        takes_value: true
    - file:
        short: f
        long: file
        value_name: FILE
        takes_value: true
    - ignore-case:
        short: i
        long: ignore-case
    - invert-match:
        short: v
        long: invert-match
    - word-regexp:
        short: w
        long: word-regexp
    - line-regexp:
        short: x
        long: line-regexp
    - obsolate-i:
        short: y
    - count:
        short: c
        long: count
    - color:
        long: color
        value_name: WHEN
        takes_value: false
    - colour:
        long: colour
        value_name: WHEN
        takes_value: false
    - files-without-match:
        short: L
        long: files-without-match
    - files-with-matches:
        short: l
        long: files-with-matches
    - max-count:
        short: m
        long: max-count
        value_name: NUM
        takes_value: true
    - only-matching:
        short: o
        long: only-matching
    - quiet:
        short: q
        long: quiet
    - silent:
        long: silent
    - no-messages:
        short: s
        long: no-messages
    - byte-offset:
        short: b
        long: byte-offset
    - with-filename:
        short: H
        long: with-filename
    - no-filename:
        short: h
        long: no-filename
    - label:
        long: label
        value_name: LABEL
        takes_value: true
    - line-number:
        short: n
        long: line-number
    - initial-tab:
        short: T
        long: initial-tab
    - unix-byte-offsets:
        short: u
        long: unix-byte-offsets
    - _null:
        short: Z
        long: _null
```

grepのオプションをどこまでそのまま記述できるかを試したのだが、`--null`を定義するところで、以下のエラーが出る。

```shell
    Finished dev [unoptimized + debuginfo] target(s) in 8.19s
     Running `target/debug/perg --help -V --config`
thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', /home/vagrant/.cargo/registry/src/github.com-1ecc6299db9ec823/clap-2.33.3/src/args/arg.rs:102:42
note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace
```

当然といえば当然だが、`null`とそのまま記述することはできない。値が無いこと、と解釈されてしまう。何かしら適切な名前に変更するしかない。


```yaml:cli.yaml(抜粋)
    - _null:
        short: Z
        long: _null
```

# 振り返り
1. 既存コマンドの移植、ということになると、YAML定義は難しい面もあるが、新規コマンドを作る時は、形式が統一されるので便利。