我想让StructOpt与枚举一起工作,这样每当用户传递-d sunday时,它都被解析为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);
}我目前最好的解决方案是使用Option<String>作为类型并传递自定义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")
}发布于 2019-02-14 10:09:49
Struct接受实现FromStr的任何类型,这些类型离您的parse_day函数不远:
use std::str::FromStr;
// any error type implementing Display is acceptable.
type ParseError = &'static str;
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"),
}
}
}此外,default_value应该是一个字符串,它将被解释为使用from_str的Day。
#[structopt(short = "d", long = "day", default_value = "monday")]
day: Day,发布于 2019-09-30 15:57:59
@kennytm方法可以工作,但是arg_enum!宏是一种更简洁的方法,如structopt所示
arg_enum! {
#[derive(Debug)]
enum Day {
Sunday,
Monday
}
}
#[derive(StructOpt, Debug)]
struct Opt {
/// Important argument.
#[structopt(possible_values = &Day::variants(), case_insensitive = true)]
i: Day,
}
fn main() {
let opt = Opt::from_args();
println!("{:?}", opt);
}这将允许您将工作日解析为Sunday或sunday。
发布于 2019-02-14 10:10:38
错误信息是:
error[E0277]: the trait bound `Day: std::str::FromStr` is not satisfied
--> src/main.rs:22:17
|
22 | #[derive(Debug, StructOpt)]
| ^^^^^^^^^ the trait `std::str::FromStr` is not implemented for `Day`
|
= note: required by `std::str::FromStr::from_str`您可以按照消息的建议,通过实现FromStr for Day (参见kennytm的回答)或为Day定义一个解析函数来解决这一问题。
fn parse_day(src: &str) -> Result<Day, String> {
match src {
"sunday" => Ok(Day::Sunday),
"monday" => Ok(Day::Monday),
_ => Err(format!("Invalid day: {}", src))
}
}并使用try_from_str属性指定它:
/// Day of the week
#[structopt(short = "d", long = "day", parse(try_from_str = "parse_day"), default_value = "monday")]
day: Day,https://stackoverflow.com/questions/54687403
复制相似问题