如何使用 clap 将命令行参数解析为非单位枚举?

问题描述 投票:0回答:1

我有这个枚举:

#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, ValueEnum, Debug)]
pub enum TheAge {
    Adult,
    Age(u8)
}

还有 cli 结构

#[derive(Parser)]
#[command(author, version, about, long_about)]
pub struct Cli {
    #[arg(short, long, value_enum)]
    pub age: TheAge
}

此操作失败并出现以下错误:

error: `#[derive(ValueEnum)]` only supports unit variants. Non-unit variants must be skipped

当我从枚举中删除

Age(u8)
时,它会编译。

关于如何使用非单位变体的枚举有什么技巧吗?

rust enums clap
1个回答
0
投票

ValueEnum
不支持非单位变体,因此您无法导出它。 相反,您可以为该结构实现
From<&str>
,它将起作用:

use clap::Parser;
#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Debug)]
pub enum TheAge {
    Adult,
    Age(u8)
}

impl From<&str> for TheAge {
    fn from(v: &str) -> TheAge {
        v.parse::<u8>().map_or(TheAge::Adult, |a| if a >= 18 { TheAge::Adult } else { TheAge::Age(a) })
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.