use crate::*;
#[macro_export]
macro_rules! glassbench {
(
$title: literal,
$( $fun: path, )+
) => {
pub fn main() {
use glassbench::*;
let name = env!("CARGO_CRATE_NAME");
let cmd = Command::read();
if cmd.include_bench(&name) {
let mut bench = create_bench(name, $title, &cmd);
$(
$fun(&mut bench);
)+
if let Err(e) = after_bench(&mut bench, &cmd) {
eprintln!("{}", e);
}
} else {
println!("skipping bench {:?}", &name);
}
}
}
}
pub fn create_bench<S1, S2>(name: S1, title: S2, cmd: &Command) -> Bench
where
S1: Into<String>,
S2: Into<String>,
{
let mut bench = Bench::new(name, title);
bench.tag = cmd.tag.clone();
bench
}
pub fn after_bench(bench: &mut Bench, cmd: &Command) -> Result<(), GlassBenchError> {
let printer = Printer::new();
let mut db = Db::open()?;
let previous = db.last_bench_named(&bench.name)?;
let report = Report::new(bench, &previous);
report.print(&printer);
let mut no_save = cmd.no_save;
if let Some(graph_arg) = cmd.graph.as_ref() {
let task_name = bench.task_name_from_arg(graph_arg);
let viewer = HtmlViewer::new(&bench.name, task_name);
viewer.open_in_browser()?;
no_save = true;
}
if let Some(tbl_arg) = cmd.history.as_ref() {
let history = bench.task_history(&mut db, tbl_arg)?;
let tbl = HistoryTbl::new(&history);
tbl.print(&printer);
no_save = true;
}
if !no_save {
db.save_bench(bench)?;
}
Ok(())
}