use std::ffi::OsString;
use std::path::Path;
use super::family::{Family, Tool};
pub enum Target {
Tool(&'static Tool, Vec<OsString>),
Repo(Vec<OsString>),
}
pub fn resolve(family: &'static Family, mut argv: Vec<OsString>) -> Target {
let invoked = argv
.first()
.map(|arg0| invoked_name(Path::new(arg0)))
.unwrap_or_default();
if let Some(tool) = family.by_name(&invoked) {
argv[0] = OsString::from(tool.name);
return Target::Tool(tool, argv);
}
if let Some(tool) = argv
.get(1)
.and_then(|word| word.to_str())
.and_then(|word| family.by_word(word))
{
let mut rest = argv.split_off(2);
rest.insert(0, OsString::from(tool.name));
return Target::Tool(tool, rest);
}
if argv.is_empty() {
argv.push(OsString::from(family.repo));
}
Target::Repo(argv)
}
pub fn invoked_name(arg0: &Path) -> String {
let name = arg0
.file_name()
.map(|name| name.to_string_lossy().into_owned())
.unwrap_or_default();
match name.strip_suffix(".exe") {
Some(stem) => stem.to_string(),
None => name,
}
}