use crate::{
apis::ManagedApis,
environment::{BlessedSource, GeneratedSource, ResolvedEnv},
output::{
CheckResult, Styles, display_load_problems, display_resolution,
headers::*,
},
resolved::{ProblemSummary, Resolved},
};
use std::io;
pub(crate) fn check_impl(
writer: &mut dyn io::Write,
apis: &ManagedApis,
env: &ResolvedEnv,
blessed_source: &BlessedSource,
generated_source: &GeneratedSource,
styles: &Styles,
) -> anyhow::Result<CheckResult> {
let (result, _summaries) = check_impl_with_summaries(
writer,
apis,
env,
blessed_source,
generated_source,
styles,
)?;
Ok(result)
}
pub(crate) fn check_impl_with_summaries(
writer: &mut dyn io::Write,
apis: &ManagedApis,
env: &ResolvedEnv,
blessed_source: &BlessedSource,
generated_source: &GeneratedSource,
styles: &Styles,
) -> anyhow::Result<(CheckResult, Vec<ProblemSummary>)> {
writeln!(writer, "{:>HEADER_WIDTH$}", SEPARATOR)?;
let (generated, errors) = generated_source.load(
writer,
apis,
styles,
&env.repo_root,
&env.vcs,
)?;
display_load_problems(writer, &errors, styles)?;
let (local_files, errors) = env.local_source.load(
writer,
apis,
styles,
&env.repo_root,
&env.vcs,
)?;
display_load_problems(writer, &errors, styles)?;
let (blessed, errors) =
blessed_source.load(writer, &env.repo_root, apis, styles, &env.vcs)?;
display_load_problems(writer, &errors, styles)?;
let resolved = Resolved::new(env, apis, &blessed, &generated, &local_files);
writeln!(writer, "{:>HEADER_WIDTH$}", SEPARATOR)?;
let result = display_resolution(writer, env, apis, &resolved, styles)?;
let summaries = resolved.problem_summaries();
drop(resolved);
std::thread::scope(|s| {
s.spawn(|| drop(blessed));
s.spawn(|| drop(generated));
s.spawn(|| drop(local_files));
});
Ok((result, summaries))
}