dropshot_api_manager/cmd/
check.rs

1// Copyright 2025 Oxide Computer Company
2
3use crate::{
4    FAILURE_EXIT_CODE, NEEDS_UPDATE_EXIT_CODE,
5    apis::ManagedApis,
6    environment::{BlessedSource, GeneratedSource, ResolvedEnv},
7    output::{
8        CheckResult, OutputOpts, Styles, display_load_problems,
9        display_resolution, headers::*,
10    },
11    resolved::Resolved,
12};
13use std::process::ExitCode;
14
15impl CheckResult {
16    pub fn to_exit_code(self) -> ExitCode {
17        match self {
18            CheckResult::Success => ExitCode::SUCCESS,
19            CheckResult::NeedsUpdate => NEEDS_UPDATE_EXIT_CODE.into(),
20            CheckResult::Failures => FAILURE_EXIT_CODE.into(),
21        }
22    }
23}
24
25pub(crate) fn check_impl(
26    apis: &ManagedApis,
27    env: &ResolvedEnv,
28    blessed_source: &BlessedSource,
29    generated_source: &GeneratedSource,
30    output: &OutputOpts,
31) -> anyhow::Result<CheckResult> {
32    let mut styles = Styles::default();
33    if output.use_color(supports_color::Stream::Stderr) {
34        styles.colorize();
35    }
36
37    eprintln!("{:>HEADER_WIDTH$}", SEPARATOR);
38
39    let (generated, errors) = generated_source.load(apis, &styles)?;
40    display_load_problems(&errors, &styles)?;
41
42    let (local_files, errors) = env.local_source.load(apis, &styles)?;
43    display_load_problems(&errors, &styles)?;
44
45    let (blessed, errors) = blessed_source.load(apis, &styles)?;
46    display_load_problems(&errors, &styles)?;
47
48    let resolved = Resolved::new(env, apis, &blessed, &generated, &local_files);
49
50    eprintln!("{:>HEADER_WIDTH$}", SEPARATOR);
51    display_resolution(env, apis, &resolved, &styles)
52}