Rewrite imag binary
This commit is contained in:
parent
6909410a43
commit
ecbbc3dfc1
1 changed files with 69 additions and 72 deletions
107
bin/src/main.rs
107
bin/src/main.rs
|
@ -13,8 +13,9 @@ use std::io::ErrorKind;
|
||||||
|
|
||||||
use walkdir::WalkDir;
|
use walkdir::WalkDir;
|
||||||
use crossbeam::*;
|
use crossbeam::*;
|
||||||
|
use clap::{Arg, SubCommand};
|
||||||
|
|
||||||
const DBG_FLAG: &'static str = "--debug";
|
use libimagrt::runtime::Runtime;
|
||||||
|
|
||||||
fn help(cmds: Vec<String>) {
|
fn help(cmds: Vec<String>) {
|
||||||
println!(r#"
|
println!(r#"
|
||||||
|
@ -100,51 +101,40 @@ fn get_commands() -> Vec<String> {
|
||||||
execs
|
execs
|
||||||
}
|
}
|
||||||
|
|
||||||
fn find_command() -> Option<String> {
|
|
||||||
env::args().skip(1).filter(|x| !x.starts_with("-")).next()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn find_flag() -> Option<String> {
|
|
||||||
env::args().skip(1).filter(|x| x.starts_with("-")).next()
|
|
||||||
}
|
|
||||||
|
|
||||||
fn is_debug_flag<T: AsRef<str>>(ref s: &T) -> bool {
|
|
||||||
s.as_ref() == DBG_FLAG
|
|
||||||
}
|
|
||||||
|
|
||||||
fn find_args(command: &str) -> Vec<String> {
|
|
||||||
env::args()
|
|
||||||
.skip(1)
|
|
||||||
.position(|e| e == command)
|
|
||||||
.map(|pos| env::args().skip(pos + 2).collect::<Vec<String>>())
|
|
||||||
.unwrap_or(vec![])
|
|
||||||
}
|
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
|
let appname = "imag";
|
||||||
|
let version = &version!();
|
||||||
|
let about = "imag - the PIM suite for the commandline";
|
||||||
|
let mut app = Runtime::get_default_cli_builder(appname, version, about);
|
||||||
|
|
||||||
let commands = get_commands();
|
let commands = get_commands();
|
||||||
let mut args = env::args();
|
|
||||||
let _ = args.next();
|
for command in commands.iter() {
|
||||||
let first_arg = match find_command() {
|
let s = SubCommand::with_name(&command[..]);
|
||||||
Some(s) => s,
|
app = app.subcommand(s)
|
||||||
None => match find_flag() {
|
}
|
||||||
Some(s) => s,
|
|
||||||
None => {
|
let app = app.arg(Arg::with_name("version")
|
||||||
help(commands);
|
.long("version")
|
||||||
|
.takes_value(false)
|
||||||
|
.required(false)
|
||||||
|
.multiple(false)
|
||||||
|
.help("Get the version of imag"))
|
||||||
|
.arg(Arg::with_name("versions")
|
||||||
|
.long("versions")
|
||||||
|
.takes_value(false)
|
||||||
|
.required(false)
|
||||||
|
.multiple(false)
|
||||||
|
.help("Get the versions of the imag commands"));
|
||||||
|
|
||||||
|
let matches = app.get_matches();
|
||||||
|
|
||||||
|
if matches.is_present("version") {
|
||||||
|
println!("imag {}", &version!()[..]);
|
||||||
exit(0);
|
exit(0);
|
||||||
},
|
}
|
||||||
},
|
|
||||||
};
|
|
||||||
let is_debug = env::args().skip(1).find(is_debug_flag).is_some();
|
|
||||||
|
|
||||||
match &first_arg[..] {
|
if matches.is_present("versions") {
|
||||||
"--help" | "-h" => {
|
|
||||||
help(commands);
|
|
||||||
exit(0);
|
|
||||||
},
|
|
||||||
|
|
||||||
"--version" => println!("imag {}", &version!()[..]),
|
|
||||||
|
|
||||||
"--versions" => {
|
|
||||||
let mut result = vec![];
|
let mut result = vec![];
|
||||||
for command in commands.iter() {
|
for command in commands.iter() {
|
||||||
result.push(crossbeam::scope(|scope| {
|
result.push(crossbeam::scope(|scope| {
|
||||||
|
@ -164,24 +154,33 @@ fn main() {
|
||||||
for versionstring in result.into_iter().map(|handle| handle.join()) {
|
for versionstring in result.into_iter().map(|handle| handle.join()) {
|
||||||
println!("{}", versionstring);
|
println!("{}", versionstring);
|
||||||
}
|
}
|
||||||
},
|
|
||||||
|
|
||||||
s => {
|
|
||||||
let mut subcommand_args = find_args(s);
|
|
||||||
if is_debug && subcommand_args.iter().find(is_debug_flag).is_none() {
|
|
||||||
subcommand_args.insert(0, String::from(DBG_FLAG));
|
|
||||||
}
|
}
|
||||||
match Command::new(format!("imag-{}", s))
|
|
||||||
|
matches.subcommand_name()
|
||||||
|
.map(|subcommand| {
|
||||||
|
|
||||||
|
let mut subcommand_args = vec![];
|
||||||
|
|
||||||
|
for arg in Runtime::arg_names() {
|
||||||
|
matches.value_of(arg)
|
||||||
|
.map(|value| {
|
||||||
|
subcommand_args.push(arg);
|
||||||
|
subcommand_args.push(value);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
match Command::new(format!("imag-{}", subcommand))
|
||||||
.stdin(Stdio::inherit())
|
.stdin(Stdio::inherit())
|
||||||
.stdout(Stdio::inherit())
|
.stdout(Stdio::inherit())
|
||||||
.stderr(Stdio::inherit())
|
.stderr(Stdio::inherit())
|
||||||
|
.arg(subcommand)
|
||||||
.args(&subcommand_args[..])
|
.args(&subcommand_args[..])
|
||||||
.spawn()
|
.spawn()
|
||||||
.and_then(|mut handle| handle.wait())
|
.and_then(|mut handle| handle.wait())
|
||||||
{
|
{
|
||||||
Ok(exit_status) => {
|
Ok(exit_status) => {
|
||||||
if !exit_status.success() {
|
if !exit_status.success() {
|
||||||
println!("{} exited with non-zero exit code", s);
|
println!("{} exited with non-zero exit code", subcommand);
|
||||||
exit(exit_status.code().unwrap_or(42));
|
exit(exit_status.code().unwrap_or(42));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
@ -189,11 +188,11 @@ fn main() {
|
||||||
Err(e) => {
|
Err(e) => {
|
||||||
match e.kind() {
|
match e.kind() {
|
||||||
ErrorKind::NotFound => {
|
ErrorKind::NotFound => {
|
||||||
println!("No such command: 'imag-{}'", s);
|
println!("No such command: 'imag-{}'", subcommand);
|
||||||
exit(2);
|
exit(2);
|
||||||
},
|
},
|
||||||
ErrorKind::PermissionDenied => {
|
ErrorKind::PermissionDenied => {
|
||||||
println!("No permission to execute: 'imag-{}'", s);
|
println!("No permission to execute: 'imag-{}'", subcommand);
|
||||||
exit(1);
|
exit(1);
|
||||||
},
|
},
|
||||||
_ => {
|
_ => {
|
||||||
|
@ -203,7 +202,5 @@ fn main() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
});
|
||||||
},
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue