fn main()

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(())
}