## 真面目なやり方
[[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>,
}
```