use std::io::{self, ErrorKind};
use std::path::Path;
use std::process::{Command, Stdio};
use camino::Utf8PathBuf;
use super::{Cli, CommandEnv, NinjaBuildRequest, NinjaToolRequest, canonicalize_utf8_path};
fn configure_ninja_base(
cmd: &mut Command,
cli: &Cli,
build_file: &Path,
env: &CommandEnv,
) -> io::Result<()> {
env.apply(cmd);
if let Some(dir) = &cli.directory {
let canonical = canonicalize_utf8_path(dir.as_path())?;
cmd.current_dir(canonical.as_std_path());
}
if let Some(jobs) = cli.jobs {
cmd.arg("-j").arg(jobs.to_string());
}
let build_file_path = canonicalize_utf8_path(build_file).or_else(|_| {
Utf8PathBuf::from_path_buf(build_file.to_path_buf()).map_err(|_| {
io::Error::new(
ErrorKind::InvalidData,
format!(
"build file path {} is not valid UTF-8",
build_file.display()
),
)
})
})?;
cmd.arg("-f").arg(build_file_path.as_std_path());
cmd.stdout(Stdio::piped());
cmd.stderr(Stdio::piped());
Ok(())
}
pub(super) fn configure_ninja_build_command(
cmd: &mut Command,
request: &NinjaBuildRequest<'_>,
) -> io::Result<()> {
configure_ninja_base(cmd, request.cli, request.build_file, request.env)?;
let targets = request.targets;
cmd.args(targets.as_slice());
Ok(())
}
pub(super) fn configure_ninja_tool_command(
cmd: &mut Command,
request: &NinjaToolRequest<'_>,
) -> io::Result<()> {
configure_ninja_base(cmd, request.cli, request.build_file, request.env)?;
cmd.arg("-t").arg(request.tool);
Ok(())
}