use crate::action::Action;
use crate::args::Args;
use std::collections::HashMap;
use std::env;
type ActionFn = fn(&Args);
pub struct ActionApp {
pub command: String, pub alias: Vec<String>,
pub action: Box<dyn Action>,
}
pub struct Cmd {
raw_args: Vec<String>,
calls: HashMap<String, ActionFn>, actions: Vec<ActionApp>, action_default: Option<ActionFn>, action_no_handler: Option<ActionFn>, args: Option<Args>,
}
impl Cmd {
pub fn from(param: Vec<&str>) -> Cmd {
let mut args: Vec<String> = Vec::new();
for arg in param {
args.push(String::from(arg));
}
let mut app = Cmd {
raw_args: args,
calls: HashMap::new(),
action_default: None,
action_no_handler: None,
args: None,
actions: Vec::new(),
};
app.parse_args();
return app;
}
fn get_os_args(&mut self) {
let mut args: Vec<String> = Vec::new();
let mut idx = 0;
for arg in env::args() {
if idx < 1 {
idx += 1;
continue;
}
args.push(arg);
}
self.raw_args = args;
}
fn parse_args(&mut self) {
if self.raw_args.is_empty() {
self.get_os_args()
}
}
pub fn register(&mut self, name: &str, action: ActionFn) -> &mut Cmd {
self.calls.insert(String::from(name), action);
self
}
pub fn register_action(&mut self, app: Box<ActionApp>) -> &mut Cmd {
self.actions.push(*app);
self
}
pub fn empty(&mut self, action: ActionFn) -> &mut Cmd {
self.action_default = Some(action);
self
}
pub fn un_found(&mut self, action: ActionFn) -> &mut Cmd {
self.action_no_handler = Some(action);
self
}
pub fn run(&mut self) {
let args = Args::new(&self.raw_args);
self.args = Some(args);
for (v_key, v_fn) in &self.calls {
if self.args.as_ref().unwrap().command == String::from(v_key) {
v_fn(self.args.as_ref().unwrap());
return;
}
}
for action in &self.actions {
if action.command == self.args.as_ref().unwrap().command {
action.action.as_ref().run(self.args.as_ref().unwrap());
return;
} else {
for alias in &action.alias {
if String::from(alias) == self.args.as_ref().unwrap().command {
action.action.as_ref().run(self.args.as_ref().unwrap());
return;
}
}
}
}
if !self.action_no_handler.is_none() && !self.args.as_ref().unwrap().command.is_empty() {
(self.action_no_handler.as_ref().unwrap())(self.args.as_ref().unwrap());
return;
}
if !self.action_default.is_none() {
(self.action_default.as_ref().unwrap())(self.args.as_ref().unwrap());
}
}
}