use std::fmt::{Display};
use std::string::String;
use std::env;
use crate::argparse::arg::Arg;
#[derive(Debug, Clone, Default)]
pub struct Command {
name: String,
author: String,
version: String,
about: String,
subcommands: Vec<Command>,
current_disp_ord: Option<usize>,
disp_ord: Option<usize>,
}
impl Command {
pub fn new(name: &str) -> Self {
fn new_inner(name: &str) -> Command {
let name = name.to_string();
Command {
name,
..Default::default()
}
}
new_inner(name)
}
pub fn author(mut self, author: &str) -> Self {
self.author = author.to_string();
self
}
pub fn version(mut self, version: &str) -> Self {
self.version = version.to_string();
self
}
pub fn about(mut self, about: &str) -> Self {
self.about = about.to_string();
self
}
pub fn add(mut self, arg: Arg) -> Self {
self
}
#[inline]
#[must_use]
pub fn subcommand(self, subcmd: impl Into<Command>) -> Self {
let subcmd = subcmd.into();
self.subcommand_internal(subcmd)
}
fn subcommand_internal(mut self, mut subcmd: Self) -> Self {
if let Some(current_disp_ord) = self.current_disp_ord.as_mut() {
let current = *current_disp_ord;
subcmd.disp_ord.get_or_insert(current);
*current_disp_ord = current + 1;
}
self.subcommands.push(subcmd);
self
}
pub fn get_matches(self) -> Self {
let args: Vec<String> = env::args().collect();
println!("{} {}", self.name, self.version);
println!("{}", self.author);
println!("{}", self.about);
println!();
println!("usage:");
println!(" {} <sub_command>",args.get(0).unwrap());
println!();
println!("options:");
println!(" -h, --help {}", "Print Help Information");
println!(" -v, --version {}", "Print Version Information");
println!();
println!("{:?}", args);
self
}
}