引言
我目前有使用structopt的子命令,类似于另一个answer。但是,我希望有类似于docker工作方式的嵌套子命令:
docker image ls
docker image pull当前代码
main.rs
mod cli;
use structopt::StructOpt;
use crate::cli::{Opt, Command};
fn main() {
let opt = Opt::from_args();
match opt.cmd {
Command::Subcommand { .. } => {
// Do something
}
}
}cli/mod.rs
use structopt::StructOpt;
#[derive(StructOpt, Debug)]
pub enum Command {
Subcommand {
// args
}
}
#[derive(StructOpt, Debug)]
pub struct Opt {
#[structopt(subcommand)]
pub cmd: Command,
}我试过的
添加了另一个结构: main.rs
mod cli;
use structopt::StructOpt;
use crate::cli::{Opt, Resource};
fn main() {
let opt = Opt::from_args();
match opt.resource {
Resource::Command { .. } => {
// do something
}
}
}cli/mod.rs
use structopt::StructOpt;
#[derive(StructOpt, Debug)]
pub enum Command {
Subcommand {
// args
}
}
#[derive(StructOpt, Debug)]
pub struct Resource {
#[structopt(subcommand)]
image: Image
}
#[derive(StructOpt, Debug)]
pub struct Opt {
#[structopt(subcommand)]
pub resource: Resource,
}但是,我得到了以下错误:
help: use fully-qualified syntax: `<Resource as Trait>::ImageCommand发布于 2022-01-12 22:05:21
由于命令被描述为枚举,所以子命令将是“sub”(枚举变体中的enum )。在下面的示例中,ImageCommand是命令枚举变体中的枚举:
use structopt::StructOpt;
#[derive(StructOpt, Debug)]
pub struct ImagePullOptions {
pub name: String,
}
#[derive(StructOpt, Debug)]
pub enum ImageCommand {
#[structopt(name = "ls")]
List,
Pull(ImagePullOptions),
}
#[derive(StructOpt, Debug)]
pub enum Command {
Image(ImageCommand),
}
#[derive(StructOpt, Debug)]
pub struct Options {
#[structopt(subcommand)]
pub command: Command,
}
fn main() {
let options: Options = Options::from_args();
match options.command {
Command::Image(image_command) => {
match image_command {
ImageCommand::List => println!("listing..."),
ImageCommand::Pull(pull_options) => println!("pulling {}...", pull_options.name),
}
}
}
}试验用:
$ cargo run -- image
USAGE:
testsubopt image <SUBCOMMAND>
FLAGS:
-h, --help Prints help information
-V, --version Prints version information
SUBCOMMANDS:
help Prints this message or the help of the given subcommand(s)
ls
pull $ cargo run -- image pull asd
pulling asd...https://stackoverflow.com/questions/70688380
复制相似问题