use clap::{Parser, Subcommand};
use crate::arrays::ArrayArgs;
use crate::env::EnvArgs;
use crate::json::{JsonDefaultPrinter, JsonFormatter, JsonPrettyPrinter, JsonValueCommand};
use crate::objects::ObjectArgs;
use crate::strings::StringArgs;
pub fn run() {
let args = Cli::parse();
let printer = args.printer();
let command = args.value_command();
let json_value = command.get_json_value();
printer.print(json_value);
}
#[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)]
struct Cli {
#[arg(long, short)]
pretty: bool,
#[command(subcommand)]
command: Commands,
}
impl Cli {
fn value_command(&self) -> Box<dyn JsonValueCommand> {
match &self.command {
Commands::Array(args) => Box::new(args.clone()),
Commands::Object(args) => Box::new(args.clone()),
Commands::String(args) => Box::new(args.clone()),
Commands::Env(args) => Box::new(args.clone()),
}
}
fn printer(&self) -> Box<dyn JsonFormatter> {
if self.pretty {
Box::new(JsonPrettyPrinter)
} else {
Box::new(JsonDefaultPrinter)
}
}
}
#[derive(Subcommand, Debug)]
enum Commands {
Array(ArrayArgs),
Object(ObjectArgs),
String(StringArgs),
Env(EnvArgs),
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn verify_cli() {
use clap::CommandFactory;
Cli::command().debug_assert()
}
}