clier_parser 0.7.4

Parser for building values and commands from command line arguments
Documentation
use super::utils::{is_long_flag, is_short_flag};

fn filter_commands(index: usize, all_args: &[String]) -> bool {
  let command = all_args[index].as_str();

  let is_arg_flag = is_long_flag(command) || is_short_flag(command);

  if is_arg_flag {
    return false;
  }

  let is_before_arg_flag = index != 0
    && all_args.get(index - 1).is_some_and(|flag| is_long_flag(flag) || is_short_flag(flag));

  if is_before_arg_flag {
    let before_arg = all_args.get(index - 1).unwrap();
    return before_arg.starts_with("--no-");
  }
  true
}

#[test]
fn test_filtering_commands() {
  let mut should_be_truthy = filter_commands(0, &["command".to_string()]);
  assert!(should_be_truthy);

  let mut should_be_falsy = filter_commands(1, &["--flag".to_string(), "command".to_string()]);
  assert!(!should_be_falsy);

  should_be_truthy = filter_commands(1, &["--no-flag".to_string(), "command".to_string()]);
  assert!(should_be_truthy);

  should_be_falsy = filter_commands(1, &["-vtd".to_string(), "command".to_string()]);
  assert!(!should_be_falsy);
}

pub fn transform_command_argv(args: &[String]) -> Vec<String> {
  args
    .iter()
    .enumerate()
    .filter(|(index, _)| filter_commands(*index, args))
    .map(|v| v.1.clone())
    .collect::<Vec<String>>()
}