• 作成:

RustのStructOptで環境変数に値をフォールバックさせたい時の書き方

問題

プログラムにAWSのキーを入力して動かしたい.

素直に引数に入れさせたいのでStructOptを使って認識するようにします.

use structopt::StructOpt;
#[derive(StructOpt, Debug)]
#[structopt(name = "basic")]
pub struct Opt {
    #[structopt(short = "a", long = "aws-access-key-id")]
    pub aws_access_key_id: String,
}

でもAWS関連のツールって普通環境変数の値を見てキーを認識するじゃないですか.

環境変数 - AWS Command Line Interface

その感覚でこのツールを使った人は認識しなくて混乱します.

StructOptで指定されなかった場合環境変数にフォールバックする方法無いのかなと思って,公式ドキュメントを眺めてもローレベルのパースに使ってるclapには書いてありますが,StructOpt自体のドキュメントには書いてありませんでした…

解決

でもTwitterからリンク貼られてるサンプルを見つけました.

clap-port-flag/lib.rs at master · rust-cli/clap-port-flag

というわけで先程の例は

use structopt::StructOpt;
#[derive(StructOpt, Debug)]
#[structopt(name = "basic")]
pub struct Opt {
    #[structopt(short = "a", long = "aws-access-key-id", env="AWS_ACCESS_KEY_ID")]
    pub aws_access_key_id: String,
}

と書けばみんな混乱なく利用できますね.

上流

なんで公式ドキュメントに無いんだろうと思って検索してみたらissueには上がってました.Add or_else to support arguments with environment fallbacks · Issue #160 · TeXitoi/structopt

モチベーションが無いそうです.私も今ちょっと私事でモチベーションが無いので,湧いてきたらドキュメント追加するpull request作りたいなと思います.誰か作っても良いです.