Introduction
I currently have subcommands working using structopt
, similarly to this other answer. However I would like to have nested subcommands similarly of how docker
works:
docker image ls
docker image pull
Current Code
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,
}
What I have tried
Added another struct: 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,
}
However I get the following error:
help: use fully-qualified syntax: `<Resource as Trait>::ImageCommand
Since command is described as an enum, a subcommand would be a "sub-enum" (an enum inside an enum variant). In the example below ImageCommand is an enum inside a Command enum variant:
Test with: