How can I use enums in structopt in Rust?

  • A+
Category:Languages

I'd like to make StructOpt work with enums such that every time a user passes -d sunday it'd parsed as a Day::Sunday:

#[macro_use] extern crate structopt;  use std::path::PathBuf; use structopt::StructOpt;  // My enum enum Day {     Sunday, Monday }  #[derive(Debug, StructOpt)] #[structopt(name = "example", about = "An example of StructOpt usage.")] struct Opt {     /// Set speed     #[structopt(short = "s", long = "speed", default_value = "42")]     speed: f64,     /// Input file     #[structopt(parse(from_os_str))]     input: PathBuf,     /// Day of the week     #[structopt(short = "d", long = "day", default_value = Day::Monday)]     day: Day, }  fn main() {     let opt = Opt::from_args();     println!("{:?}", opt); } 

My current best solution is to use Option<String> as a type and pass a custom parse_day():

fn parse_day(day: &str) -> Result<Day, ParseError> {     match day {         "sunday" => Ok(Day::Sunday),         _ => Ok(Day::Monday)     }     Err("Could not parse a day") } 

 


Struct-opt accepts any type which implements FromStr, which is not far away from your parse_day function:

use std::str::FromStr;  impl FromStr for Day {     type Err = ParseError;     fn from_str(day: &str) -> Result<Self, Self::Err> {         match day {             "sunday" => Ok(Day::Sunday),             "monday" => Ok(Day::Monday),             _ => Err("Could not parse a day"),         }     } } 

Additionally, the default_value should be a string, which will be interpreted into a Day using from_str.

#[structopt(short = "d", long = "day", default_value = "monday")] day: Day, 

Comment

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: