Clap-3.0だとStructOptが要らなくなるのでclap-3.0.0-beta.1をちょっと試してみた。
StructOptでは問題なくオプションになる以下のフィールドは、
#[structopt(long = "result", default_value = "", parse(from_os_str))]
pub result: PathBuf,
Clapでは引数が指定されてないエラーを起こしてしまう。 default_valueを空以外にすれば直るのだが、それは困る、Optionでくるむことにした:
#[clap(long = "result")]
pub result: Option<PathBuf>,
これで解決するのだが、なんかスマートではない。
これはClap::prase_fromに置き換えることが必要(そもそも、これを内部で呼び出しているだけ)。 もう一つ書き替えがあったのでまとめると、以下の通り。
StructOpt::from_args
-> Clap::parse
StructOpt::from_iter
-> Clap::parse_from
clapがstructoptを取り込んだようなものなので、基本は変化がないはず。 しかし、開発時期の違いだろうか、依存クレートにバージョンの違いが見られる。 またclapのメジャーバージョンアップということでcurses的なものに変化があった(共通部は省略):
$ cargo tree
splr v0.4.2-dev.1
└── structopt v0.3.14
├── clap v2.33.1
│ ├── ansi_term v0.11.0
│ └── strsim v0.8.0
└── structopt-derive v0.4.7
└── proc-macro-error v1.0.2
└── proc-macro-error-attr v1.0.2
$ cargo tree
splr v0.4.2-dev.0
└── clap v3.0.0-beta.1
├── clap_derive v3.0.0-beta.1
│ └── proc-macro-error v0.4.12
│ └── proc-macro-error-attr v0.4.12
├── indexmap v1.4.0
│ [build-dependencies]
│ └── autocfg v1.0.0
├── os_str_bytes v2.3.1
├── strsim v0.10.0
└── termcolor v1.1.0
でコンパイルしてみるとclapを使った方が(strip後のサイズで)70KBほど大きくなってしまう。 うーん、それはどうなのか。。。
コンパイル時間や実行時間に関しては見ていない。多分大きな差はないだろう。