use clap::{Parser, Subcommand};
#[derive(Parser)]
#[command(author, version, about, long_about = None)]
pub struct Cli {
#[command(subcommand)]
pub command: Commands,
}
#[derive(clap::ValueEnum, Clone)]
pub enum ConvertFormat {
Yaml,
Json,
Csv,
}
#[derive(Subcommand)]
pub enum Commands {
Client {
#[command(subcommand)]
command: PHC,
},
Inspect {
path: String,
#[arg(short = 'n', long = "sample-name")]
name: Option<String>,
#[arg(long = "st-index")]
st_index: Option<String>,
#[arg(long = "sst-index")]
sst_index: Option<String>,
#[arg(long = "amendments", num_args = 1..)]
amendments: Option<Vec<String>>,
},
Validate {
path: String,
#[arg(short = 's', long = "schema")]
schema: String,
#[arg(short = 'n', long = "sample-name")]
sample_name: Option<String>,
#[arg(long = "st-index")]
st_index: Option<String>,
#[arg(long = "sst-index")]
sst_index: Option<String>,
#[arg(long = "amendments", num_args = 1..)]
amendments: Option<Vec<String>>,
},
Convert {
path: String,
#[arg(value_enum, short = 'f', long = "format")]
format: ConvertFormat,
#[arg(short = 'p', long = "path")]
output_path: Option<String>,
#[arg(long = "st-index")]
st_index: Option<String>,
#[arg(long = "sst-index")]
sst_index: Option<String>,
#[arg(long = "amendments", num_args = 1..)]
amendments: Option<Vec<String>>,
},
}
#[derive(Subcommand)]
pub enum PHC {
Login {
#[arg(long = "token")]
token: Option<String>,
#[arg(long = "url")]
url: Option<String>,
},
Logout {},
Pull {
registry: String,
#[arg(short = 'p', long = "path")]
path: String,
#[arg(long = "zip", default_value_t = false)]
zip: bool,
},
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_my_subcommand() {
let args = vec![
"peprs",
"client",
"pull",
"registry/project:default",
"-p",
"./out",
];
let cli = Cli::try_parse_from(args).expect("Parsing failed");
match cli.command {
Commands::Client { command } => match command {
PHC::Pull {
registry,
path,
zip,
} => {
assert_eq!(registry, "registry/project:default");
assert_eq!(path, "./out");
assert!(!zip);
}
_ => unreachable!(),
},
_ => panic!("Expected Commands::Client"),
}
}
}