use clap::{Parser, ValueEnum};
use serde::{Deserialize, Serialize};
use strum::{EnumIter, EnumProperty, IntoEnumIterator, IntoStaticStr};
#[derive(Parser)]
#[command(version, about, long_about = Some("This is the long 'about'"))]
struct Cli {
#[arg(value_enum)]
opt: Opt,
}
#[derive(
ValueEnum, EnumIter, EnumProperty, IntoStaticStr, Clone, Debug, Default, Serialize, Deserialize,
)]
#[strum(serialize_all = "kebab-case")]
enum Opt {
#[default]
#[strum(props(key = "var1"))]
VariantNum1,
#[strum(props(key = "var2"))]
VariantNum2,
#[strum(props(key = "var3"))]
VariantNum3,
}
fn main() {
let cli = Cli::parse();
println!("Chosen option:");
match cli.opt {
Opt::VariantNum1 => println!("Door number 1"),
Opt::VariantNum2 => println!("Door number 2"),
Opt::VariantNum3 => println!("Door number 3"),
}
println!("\nEnum properties and text, using strum:");
for option in Opt::iter() {
println!(
"strum associated property 'key'={}, variant={:#?}",
option.get_str("key").unwrap(),
<Opt as Into<&'static str>>::into(option),
);
}
println!("\nEnum Variants, using clap:");
for variant in Opt::value_variants() {
let poss_val = variant.to_possible_value().unwrap();
println!("name={}\nvariant={poss_val:#?}", poss_val.get_name());
if let Some(comment) = poss_val.get_help() {
println!("Help (from doc comment) = {}", comment);
}
println!();
}
}