in metalos/host_configs/evaluator/src/evaluator.rs [31:79]
fn main() -> Result<()> {
let log = slog::Logger::root(slog_glog_fmt::default_drain(), slog::o!());
let opts = Opts::from_args();
let host: HostIdentity = {
if opts.host == Path::new("-") {
serde_json::from_reader(io::stdin())?
} else {
let f = File::open(&opts.host).with_context(|| {
format!("failed to open host json file {}", opts.host.display())
})?;
serde_json::from_reader(f)?
}
};
let generators: Vec<_> = opts
.generators
.into_iter()
.map(|path| {
StarlarkGenerator::load(&path)
.map_err(|e| Error::msg(format!("{:?}", e)))
.with_context(|| format!("failed to load generators in {:?}", path))
})
.collect::<Result<Vec<_>>>()?
.into_iter()
.flatten()
.collect();
let dry_run = opts.dry_run;
if !dry_run && opts.root.is_none() {
eprintln!("--root is missing, please pass a --dry-run flag ");
return Err(anyhow!(
"please include --dry-run flag for explicit dry run"
));
}
if dry_run {
for gen in generators {
let name = gen.name();
let output = gen.eval(&host)?;
println!("{}\n{:#?}", name, output);
}
return Ok(());
}
let root = opts
.root
.expect("not running in --dry-run mode, --root must be given");
for gen in generators {
let output = gen.eval(&host)?;
output.apply(log.clone(), &root)?;
}
Ok(())
}