use arctk::{
args,
file::{Build, Load},
report,
sim::babbage::{Operation, OperationBuilder},
util::{banner, dir},
};
use arctk_attr::input;
use std::{
env::current_dir,
path::{Path, PathBuf},
};
#[input]
struct Parameters {
op: OperationBuilder,
}
pub fn main() {
let term_width = arctk::util::term::width().unwrap_or(80);
banner::title("BABBAGE", term_width);
let (params_path, in_dir, out_dir) = init(term_width);
let params = input(term_width, &in_dir, ¶ms_path);
let op = build(term_width, &in_dir, params);
banner::section("Operation", term_width);
op.run(&out_dir)
.expect("Operation failed... we'll get 'em next time.");
banner::section("Finished", term_width);
}
fn init(term_width: usize) -> (PathBuf, PathBuf, PathBuf) {
banner::section("Initialisation", term_width);
banner::sub_section("Command line arguments", term_width);
args!(bin_path: PathBuf;
params_path: PathBuf
);
report!(bin_path.display(), "binary path");
report!(params_path.display(), "parameters path");
banner::sub_section("Directories", term_width);
let cwd = current_dir().expect("Failed to determine current working directory.");
let (in_dir, out_dir) = dir::io_dirs(Some(cwd.join("input")), Some(cwd.join("output")))
.expect("Failed to initialise directories.");
report!(in_dir.display(), "input directory");
report!(out_dir.display(), "output directory");
(params_path, in_dir, out_dir)
}
#[allow(clippy::let_and_return)]
fn input(term_width: usize, in_dir: &Path, params_path: &Path) -> Parameters {
banner::section("Input", term_width);
banner::sub_section("Parameters", term_width);
let params =
Parameters::load(&in_dir.join(params_path)).expect("Failed to load parameters file.");
params
}
#[allow(clippy::let_and_return)]
fn build(term_width: usize, in_dir: &Path, params: Parameters) -> Operation {
banner::section("Building", term_width);
banner::sub_section("Operation", term_width);
let op = params.op.build(in_dir).expect("Failed to build operation.");
op
}