Rust の CLI ツールで引数の値が特定のものであれば別の引数を必須にしたい
短く
crap.rs の requires_if/requires_ifs を使おう。
.arg( Arg::with_name("iterator-type") .short("t") .long("iterator-type") .possible_values(&IteratorType::variants()) .requires_ifs(&[ ("AT_SEQUENCE_NUMBER", "sequence-number"), ("AFTER_SEQUENCE_NUMBER", "sequence-number"), ("AT_TIMESTAMP", "timestamp"), ]) .default_value("LATEST") .value_name("TYPE") .help("Sets iterator type."), ) .arg( Arg::with_name("sequence-number") .long("sequence-number") .value_name("NUM") .help("Set Sequence number when Iterator Type is AT_SEQUENCE_NUMBER or AFTER_SEQUENCE_NUMBER.") .takes_value(true), ) .arg( Arg::with_name("timestamp") .long("timestamp") .value_name("TIMESTAMP") .help("Set timestamp(UNIX Epoch milliseconds) when Iterator Type is AT_TIMESTAMP.") .takes_value(true), )
k-iter/main.rs at f22bd285818a23ec5eb766d53798a584ddaffed2 · ROki1988/k-iter
背景
AWS Kinesis Stream のイテレータは、下記の通り 5 種類あります。
- LATEST
- AT_SEQUENCE_NUMBER
- AFTER_SEQUENCE_NUMBER
- AT_TIMESTAMP
- TRIM_HORIZON
このうち 3 種には値が必要なので、追加のオプションで指定してもらいたい感じでした。
なので、そのオプションはイテレータが 3 種のうちのどれかであれば必須、となります。
そんなのかけるのやら…
多機能引数パーザ clap
すごいですねー。ありましたよ。requires_ifs
ある引数に対する追加設定として記述できます。
タプルの1つ目が、その引数がとりうる値で、2つ目が必須となるオプションの名前となります。
Arg::with_name("iterator-type") .short("t") .long("iterator-type") .possible_values(&IteratorType::variants()) .requires_ifs(&[ ("AT_SEQUENCE_NUMBER", "sequence-number"), ("AFTER_SEQUENCE_NUMBER", "sequence-number"), ("AT_TIMESTAMP", "timestamp"), ])
先にあげた例を抜粋しました。
今回であれば、iterator-type
に対して、AT_SEQUENCE_NUMBER か AFTER_SEQUENCE_NUMBER、AT_TIMESTAMP の時にそれぞれ必須となる引数の名前を指定してます。
自分で書いてもよいのですが、あるのであれば使います。
ありがたやありがたや。
というわけで
無事 k-iter でオプションを追加できましたー!やったぜ。
これで追跡がらくになる。はず。
次
localstack を使ったテストを書きたい。