## 真面目なやり方 [[FromStr]]トレイトが実装されていればOK。 ```rust #[derive(Clap, Debug)] pub struct Opts { #[clap(short, long, default_value = "csv")] output_type: WriterType, } #[derive(Debug)] pub enum WriterType { CSV, TSV, } // ここで文字列をオプションに変換している impl FromStr for WriterType { type Err = anyhow::Error; fn from_str(s: &str) -> Result<Self, Self::Err> { match s { "csv" => Ok(WriterType::CSV), "tsv" => Ok(WriterType::TSV), _ => bail!("Couldn't parse"), } } } ``` ## 楽なやり方 [[Strum]]を使う。 ```rust use strum_macros::EnumString; #[derive(Clap, Debug)] pub struct Opts { #[clap(short, long, default_value = "csv")] format: Format, } #[derive(Debug, EnumString)] #[strum(serialize_all = "snake_case")] pub enum Format { CSV, TSV, JSON, YAML, } ``` 選択肢をhelp messageに表示したい場合は[EnumVariantNames]を使う。 [EnumVariantNames]: https://docs.rs/strum_macros/0.20.1/strum_macros/derive.EnumVariantNames.html ```rust use strum_macros::{EnumString, EnumVariantNames}; #[derive(Debug, EnumString, EnumVariantNames)] #[strum(serialize_all = "snake_case")] pub enum Format { CSV, TSV, JSON, PJSON, YAML, } ``` [[clap]]呼び出し側では[VariantNames]が必要なので注意。 [VariantNames]: https://docs.rs/strum/0.20.0/strum/trait.VariantNames.html ```rust // 忘れずに use strum::VariantNames; #[derive(Clap, Debug)] pub struct Opts { #[clap(short, long, default_value = "csv", possible_values(Format::VARIANTS))] format: Format, } ``` ### Option型 型を[[Option (Rust)|Option]]に包むだけでよしなに対応してくれる。 ```rust use strum::VariantNames; #[derive(Clap, Debug)] pub struct Opts { #[clap(short, long, possible_values(Format::VARIANTS))] format: Option<Format>, } ```