#![deny(
clippy::clone_on_ref_ptr,
clippy::default_trait_access,
clippy::doc_markdown,
clippy::empty_enum,
clippy::empty_line_after_outer_attr,
clippy::enum_glob_use,
clippy::expl_impl_clone_on_copy,
clippy::fallible_impl_from,
clippy::float_cmp_const,
clippy::items_after_statements,
clippy::match_same_arms,
clippy::multiple_inherent_impl,
clippy::mut_mut,
clippy::needless_continue,
clippy::range_plus_one,
clippy::single_match_else,
clippy::unimplemented,
clippy::unnecessary_unwrap,
clippy::use_self,
clippy::used_underscore_binding,
clippy::writeln_empty_string,
clippy::wrong_self_convention,
missing_copy_implementations,
missing_debug_implementations,
trivial_casts,
trivial_numeric_casts,
unreachable_pub,
unused_extern_crates,
unused_import_braces,
unused_qualifications,
unused_results,
variant_size_differences,
warnings
)]
use std::io;
use clap::Parser;
use ia_sandbox::utils::DurationExt;
mod app;
pub(crate) mod args;
use app::App;
use args::OutputType;
fn main() -> anyhow::Result<()> {
let (config, output_type) = App::try_parse()?
.load_config_file()?
.into_config_and_output();
let run_info = ia_sandbox::spawn_jail(&config)?.wait()?;
match output_type {
OutputType::Human => println!("{}", run_info),
OutputType::Oneline => {
if run_info.is_success() {
print!("OK: ");
} else {
print!("FAIL: ");
}
println!(
"time {}ms memory {}kb: {}",
run_info.usage().user_time().as_milliseconds(),
run_info.usage().memory().as_kilobytes(),
run_info.result()
);
}
OutputType::Json => {
let stdout = io::stdout();
serde_json::to_writer_pretty(stdout.lock(), &run_info)?;
}
}
Ok(())
}