ソモサン

私rohkiによる活動や読書の記録をつらつらと書くページです

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_NUMBERAFTER_SEQUENCE_NUMBERAT_TIMESTAMP の時にそれぞれ必須となる引数の名前を指定してます。

自分で書いてもよいのですが、あるのであれば使います。
ありがたやありがたや。

というわけで

無事 k-iter でオプションを追加できましたー!やったぜ。
これで追跡がらくになる。はず。

localstack を使ったテストを書きたい。