extern crate lazy_static; use clap::{App, AppSettings, Arg}; use env_logger; use log::error; mod backends; mod conf; mod serde_duration; mod wait; fn main() { let matches = App::new("evr") .version(env!("CARGO_PKG_VERSION")) .author("syn") .setting(AppSettings::ColoredHelp) .setting(AppSettings::UnifiedHelpMessage) .arg( Arg::with_name("src") .required(true) .index(1) .help("source file"), ) .arg( Arg::with_name("time") .short("t") .long("time") .help("show wall time"), ) .arg( Arg::with_name("mem") .short("m") .long("mem") .help("show mem usage (rss)"), ) .arg( Arg::with_name("where") .short("w") .long("where") .help("only print executable location. error if does not exist"), ) .get_matches(); env_logger::builder().format_timestamp(None).init(); let src_path: std::path::PathBuf = matches.value_of("src").expect("src is required").into(); let config = match conf::get_conf() { Ok(c) => c, Err(err) => { error!("could not load config: {}", err); std::process::exit(64); // EX_USAGE (BSD sysexits(3)) } }; if matches.is_present("where") { match backends::get_binary_by_filename(src_path.as_ref()) { Ok(path) => if path.exists() { println!("{}", path.display()) } else { error!("File should be located at '{}', when you build it", path.display()) } Err(e) => error!("No binary: {}", e), } return; } if src_path.exists() { if let Some(backend) = config.get_backend(&src_path) { match backend.run(&src_path) { Ok(status) => { // print to stderr to allow `>/dev/null` for user programs if matches.is_present("time") { eprintln!("wall time: {:?}", status.wall_time); } if matches.is_present("mem") { eprintln!("rss: {}K", status.usage.get_rss_bytes() / 1000); } } Err(err) => error!("{}", err), }; } else { error!("could not match backend"); } } else { error!("File {} does not exist", src_path.display()); }; }