use std::io::Write;
use super::{build_out_dir, resolve_package};
pub(crate) fn check(
args: &mut impl Iterator<Item = String>,
out: &mut dyn Write,
) -> Result<(), String> {
let mut json_output = false;
let mut directory: Option<String> = None;
for arg in args.by_ref() {
match arg.as_str() {
"--json" => json_output = true,
_ if arg.starts_with('-') => return Err(format!("unexpected argument '{arg}'")),
_ if directory.is_none() => directory = Some(arg),
_ => return Err("check accepts at most one path".to_owned()),
}
}
let directory = directory.unwrap_or_else(|| ".".to_owned());
let (manifest, package) = match resolve_package(&directory) {
Ok(resolved) => resolved,
Err(error) => {
if json_output {
let mut diagnostics = nichlink::BuildDiagnostics::default();
diagnostics.push(nichlink::BuildDiagnostic::new("resolve", error.clone()));
writeln!(out, "{}", diagnostics.to_json())
.map_err(|error| format!("cannot write output: {error}"))?;
}
return Err(error);
}
};
let out_dir = build_out_dir(&manifest);
if json_output {
return match nichlink_build_method::check_for(&manifest, &out_dir, &package) {
Ok(()) => {
writeln!(out, "{}", nichlink::BuildDiagnostics::default().to_json())
.map_err(|error| format!("cannot write output: {error}"))?;
Ok(())
}
Err(diagnostics) => {
writeln!(out, "{}", diagnostics.to_json())
.map_err(|error| format!("cannot write output: {error}"))?;
Err(format!(
"registration check failed ({} diagnostic(s); JSON on stdout)",
diagnostics.len()
))
}
};
}
nichlink_build_method::run_for(&manifest, &out_dir, &package)?;
writeln!(out, "nichlink check: ok ({package})")
.map_err(|error| format!("cannot write output: {error}"))?;
Ok(())
}