summaryrefslogtreecommitdiff
path: root/src/bin/obnam-benchmark.rs
blob: 9a326ecfb69b734455e257edcdee49cbd4dccc10 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
use obnam_benchmark::specification::Specification;
use obnam_benchmark::result::Result;
use std::fs::File;
use std::path::PathBuf;
use std::process::exit;
use structopt::StructOpt;

fn main() {
    if let Err(err) = real_main() {
        eprintln!("ERROR: {}", err);
        exit(1);
    }
}

fn real_main() -> anyhow::Result<()> {
    let opt = Opt::from_args();

    match opt.cmd {
        Command::Run(x) => x.run()?,
        Command::Spec(x) => x.run()?,
    }

    Ok(())
}

#[derive(Debug, StructOpt)]
struct Opt {
    #[structopt(subcommand)]
    cmd: Command,
}

#[derive(Debug, StructOpt)]
enum Command {
    /// Run benchmarks
    Run(Run),

    /// Dump the specification as JSON
    Spec(Spec),
}

#[derive(Debug, StructOpt)]
struct Run {
    /// Name of the specification file
    #[structopt(parse(from_os_str))]
    spec: PathBuf,

    /// Name of file where the results will be written.
    #[structopt(long, parse(from_os_str))]
    output: PathBuf,
}

impl Run {
    fn run(&self) -> anyhow::Result<()> {
        let spec = Specification::from_file(&self.spec)?;
        let mut result = Result::default();
        let mut current_benchmark = None;
        for step in spec.steps() {
            if let Some(m) = step.execute(&mut current_benchmark)? {
                result.push(m);
            }
        }
        let output = File::create(&self.output)?;
        serde_json::to_writer_pretty(&output, &result)?;
        Ok(())
    }
}

#[derive(Debug, StructOpt)]
struct Spec {
    /// Name of the specification file
    #[structopt(parse(from_os_str))]
    spec: PathBuf,

    /// Name of JSON file to write
    #[structopt(long, parse(from_os_str))]
    output: PathBuf,
}

impl Spec {
    fn run(&self) -> anyhow::Result<()> {
        let input = File::open(&self.spec)?;
        let spec: Specification = serde_yaml::from_reader(&input)?;

        let output = File::create(&self.output)?;
        serde_json::to_writer(&output, &spec)?;

        Ok(())
    }
}