[英]Clap - subcommands with possibly shared sets of default values?
一直在这个问题上兜圈子,一直没找到好的解决办法:
我在同一个代码库中有一堆模拟。 我正在尝试成为一个成年人并使用命令行 arguments 来选择运行哪个模拟以及使用哪些参数。 问题是很多 arguments 在不同的模拟之间共享,并且一些集合被传递给共享组件。
例如,在下面我有三个模拟,其中两个共享“Threaded”参数子集,另外两个共享MazeCli
参数子集,这是Maze
特征所需要的。 (完整的东西,还有更多的arguments和组合。)
use clap::*;
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[command(subcommand)]
sim: Simulation,
}
#[derive(Subcommand, Debug)]
enum Simulation {
Maze {
maze_args: MazeCli,
thread_args: ThreadCli,
},
ThreadedMaze {
maze_args: MazeCli,
},
Threaded {
thread_args: ThreadCli,
},
}
trait Maze {
fn new(args: MazeCli) -> Self;
}
#[derive(Args, Debug, Clone)]
struct MazeCli {
squares: usize,
openness: f64,
}
#[derive(Args, Debug, Clone)]
struct ThreadCli {
threads: usize,
}
fn main() {
let config = Cli::parse();
println!("{:?}", config);
}
该版本失败是因为它希望MazeCli
和ThreadCli
实现ValueEnum
(据我所知 - 实际错误很长且无用)。 但是,不能为结构派生 ValueEnum。 我尝试了其他几种方法,但没有得到任何可以编译的东西。
我可以将所有事情作为一个平面参数列表来完成,但是错误消息不会告诉您运行的特定子命令的预期结果。
我可以手动指定每个列表,但这是一堆样板,尤其是在考虑默认值时。
这样做的正确方法是什么? 拍手支持它吗?
奖金问题:
default
值以某种方式回退到该结构的Default
特征实现吗? 使用#[command(flatten)]
:
#[derive(Subcommand, Debug)]
enum Simulation {
Maze {
#[command(flatten)]
maze_args: MazeCli,
#[command(flatten)]
thread_args: ThreadCli,
},
ThreadedMaze {
#[command(flatten)]
maze_args: MazeCli,
},
Threaded {
#[command(flatten)]
thread_args: ThreadCli,
},
}
我可以使默认值以某种方式回退到该结构的默认特征实现吗?
使用不带参数的default_value_t
。 它默认为Default::default()
:
#[derive(Args, Debug, Clone)]
struct MazeCli {
#[arg(long, default_value_t)]
squares: usize, // Will be optional with a default of 0
openness: f64,
}
如果这完全可能,那么特定子命令是否有任何方法可以针对其特定情况覆盖通用默认值(例如,如果一个模拟默认情况下需要两倍于标准的线程数。)
我认为不使用单独的结构是不可能的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.