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作りたいなと思います. 誰か作っても良いです.