Documentation
/// Args
#[derive(Debug)]
pub struct Args {
  name: String,
  params: Option<Vec<String>>,
}

impl Args {
  pub fn name(&self) -> &str {
    &self.name[..]
  }

  pub fn params(&self) -> &Option<Vec<String>> {
    &self.params
  }
}

/// Match
pub trait Match {

  /// match args
  fn match_args(args: &Args) -> bool;
}

/// Runnable
pub trait Runnable {

  /// run args
  fn run_args(&self, args: &Args);
}

/// parse
pub fn parse(params: &Vec<String>) -> Args {
  let ps = &params[1..];
  if ps.len() <= 0 {
    return Args {
      // default
      name: String::from("help"),
      params: None,
    }
  }

  // name
  let name = &ps[0];
  // max 2 '-'
  let name = if name.starts_with('-') { &name[1..] } else { &name[..] };
  let name = if name.starts_with('-') { &name[1..] } else { &name[..] };
  let name = String::from(name);

  // params
  let ps = &ps[1..];

  // no params
  if ps.len() <= 0 {
    return Args {
      name,
      params: None,
    }
  }

  // has params
  let mut args: Vec<String> = Vec::new();
  for p in ps {
    args.push(String::from(p));
  }
  Args {
    name,
    params: Some(args),
  }
}