use super::super::options;
use super::super::tables::{
WRAPPER_OPTIONS_WITH_VALUE, WRAPPER_SUBCOMMANDS, WRAPPERS, WRAPPERS_WITH_VALUE,
};
use super::super::tokens::assignment_name;
pub(super) fn wrapped_command<'a>(argv: &'a [String], program: &str) -> Option<&'a [String]> {
if let Some((_, subcommands)) = WRAPPER_SUBCOMMANDS
.iter()
.find(|(name, _)| *name == program)
{
if !subcommands.contains(&argv.get(1)?.as_str()) {
return None;
}
let mut i = 2;
while let Some(arg) = argv.get(i) {
if arg == "--" {
i += 1;
break;
}
if !arg.starts_with('-') {
break;
}
i += 1;
}
return argv.get(i..).filter(|rest| !rest.is_empty());
}
if !WRAPPERS.contains(&program) || options::only_describes(argv, program) {
return None;
}
let options_with_value = WRAPPER_OPTIONS_WITH_VALUE
.iter()
.find(|(name, _)| *name == program)
.map_or(&[][..], |(_, opts)| *opts);
let mut i = 1;
let mut value_pending = WRAPPERS_WITH_VALUE.contains(&program);
while let Some(arg) = argv.get(i) {
if arg == "--" {
i += 1;
break;
}
if options_with_value.contains(&arg.as_str()) {
i += 2;
continue;
}
let is_env_assignment = program == "env" && assignment_name(arg).is_some();
if arg.starts_with('-') || is_env_assignment {
i += 1;
continue;
}
if value_pending {
value_pending = false;
i += 1;
continue;
}
break;
}
argv.get(i..).filter(|rest| !rest.is_empty())
}