blob: e715c5be072cd4dbcdc210f0240f938a20b1a1df [file] [log] [blame]
use crate::context::SingleBuildFileRenderContext;
use crate::rendering::Renderer;
use anyhow::{Context, Result};
use clap::Parser;
use std::path::PathBuf;
use std::sync::Arc;
#[derive(Parser, Debug)]
#[clap(about = "Command line options for the `render` subcommand", version)]
pub struct RenderOptions {
#[clap(long)]
options_json: String,
#[clap(long)]
output_path: PathBuf,
}
pub fn render(opt: RenderOptions) -> Result<()> {
let RenderOptions {
options_json,
output_path,
} = opt;
let deserialized_options = serde_json::from_str(&options_json)
.with_context(|| format!("Failed to deserialize options_json from '{}'", options_json))?;
let SingleBuildFileRenderContext {
config,
supported_platform_triples,
platform_conditions,
crate_context,
} = deserialized_options;
let renderer = Renderer::new(config, supported_platform_triples);
let platforms = renderer.render_platform_labels(Arc::clone(&platform_conditions));
let engine = renderer.create_engine(platform_conditions);
let output = renderer
.render_one_build_file(&engine, &platforms, &crate_context)
.with_context(|| {
format!(
"Failed to render BUILD.bazel file for crate {}",
crate_context.name
)
})?;
std::fs::write(&output_path, output.as_bytes()).with_context(|| {
format!(
"Failed to write BUILD.bazel file to {}",
output_path.display()
)
})?;
Ok(())
}