`clap` does have magic for enums:
use clap::{Parser, ValueEnum};
#[derive(ValueEnum, Debug, Clone)]
pub enum Foo {
Bar,
Baz,
}
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
pub struct Args {
/// description
#[arg(short = 'f', long = "foo", value_enum, default_value = "bar")]
foo: Foo,
}
The output of `--help` will look like: -f, --foo <FOO> description [default: bar] [possible values: bar, baz]
This is with clap >= 4.4 with the derive feature.