pub use crate::output::CheckResult;
#[doc(hidden)]
pub use crate::resolved::{ProblemKind, ProblemSummary};
use crate::{
apis::ManagedApis,
cmd::{
check::check_impl_with_summaries,
dispatch::{BlessedSourceArgs, GeneratedSourceArgs},
},
environment::{Environment, GeneratedSource},
output::{OutputOpts, Styles},
resolved,
};
use anyhow::Context;
use camino::Utf8PathBuf;
pub fn check_apis_up_to_date(
env: &Environment,
apis: &ManagedApis,
) -> Result<CheckResult, anyhow::Error> {
let (result, _summaries) = check_apis_with_summaries(env, apis)?;
Ok(result)
}
pub fn check_apis_with_generated_from_dir(
env: &Environment,
apis: &ManagedApis,
generated_from_dir: Utf8PathBuf,
) -> Result<CheckResult, anyhow::Error> {
let (result, _summaries) =
check_apis_with_generated_from_dir_and_summaries(
env,
apis,
generated_from_dir,
)?;
Ok(result)
}
#[doc(hidden)]
pub fn check_apis_with_summaries(
env: &Environment,
apis: &ManagedApis,
) -> Result<(CheckResult, Vec<resolved::ProblemSummary>), anyhow::Error> {
let env = resolve_env(env)?;
let (blessed_source, generated_source, output) =
default_sources(&env, None)?;
let styles = output.styles(supports_color::Stream::Stderr);
check_impl_with_summaries(
&mut std::io::stderr().lock(),
apis,
&env,
&blessed_source,
&generated_source,
&styles,
)
}
#[doc(hidden)]
pub fn check_apis_with_generated_from_dir_and_summaries(
env: &Environment,
apis: &ManagedApis,
generated_from_dir: Utf8PathBuf,
) -> Result<(CheckResult, Vec<resolved::ProblemSummary>), anyhow::Error> {
let env = resolve_env(env)?;
let (blessed_source, generated_source, output) =
default_sources(&env, Some(generated_from_dir))?;
let styles = output.styles(supports_color::Stream::Stderr);
check_impl_with_summaries(
&mut std::io::stderr().lock(),
apis,
&env,
&blessed_source,
&generated_source,
&styles,
)
}
#[doc(hidden)]
pub fn check_apis_with_render(
env: &Environment,
apis: &ManagedApis,
) -> Result<(CheckResult, Vec<resolved::ProblemSummary>, String), anyhow::Error>
{
let env = resolve_env(env)?;
let (blessed_source, generated_source, _output) =
default_sources(&env, None)?;
let styles = Styles::default();
let mut buf: Vec<u8> = Vec::new();
let (result, summaries) = check_impl_with_summaries(
&mut buf,
apis,
&env,
&blessed_source,
&generated_source,
&styles,
)?;
let rendered = String::from_utf8(buf)
.context("rendered output should be valid UTF-8")?;
Ok((result, summaries, rendered))
}
fn resolve_env(
env: &Environment,
) -> Result<crate::environment::ResolvedEnv, anyhow::Error> {
env.resolve(None)
}
fn default_sources(
env: &crate::environment::ResolvedEnv,
generated_from_dir: Option<Utf8PathBuf>,
) -> Result<
(crate::environment::BlessedSource, GeneratedSource, OutputOpts),
anyhow::Error,
> {
let blessed_source = BlessedSourceArgs {
blessed_from_vcs: None,
blessed_from_vcs_path: None,
blessed_from_dir: None,
}
.to_blessed_source(env)?;
let generated_source =
GeneratedSource::from(GeneratedSourceArgs { generated_from_dir });
let output = OutputOpts { color: clap::ColorChoice::Auto };
Ok((blessed_source, generated_source, output))
}