use std::process::ExitCode;
use cabin_core::ColorChoice;
use termcolor::StandardStream;
use crate::cli::term_color::CliColorChoice;
use crate::cli::term_verbosity::{
CliVerbosity, Reporter, discover_early_config_verbosity, resolve_verbosity,
};
use crate::error_rendering::write_plain_error;
pub(crate) struct EarlyTerminalState {
pub(crate) color: ColorChoice,
pub(crate) reporter: Reporter,
}
pub(crate) fn resolve_early_terminal_state(
cli_color: Option<CliColorChoice>,
verbose_count: u8,
quiet: bool,
) -> Result<EarlyTerminalState, ExitCode> {
let config_color = crate::cli::term_color::discover_early_config_color();
let color = match crate::cli::term_color::resolve_color_choice(
cli_color.map(Into::into),
|key| std::env::var(key).ok(),
config_color,
) {
Ok(choice) => choice,
Err(env_err) => {
let mut stderr =
StandardStream::stderr(cabin_diagnostics::termcolor_choice(ColorChoice::Auto));
let _ = write_plain_error(&mut stderr, &env_err.to_string());
return Err(ExitCode::FAILURE);
}
};
let cli_verbosity = CliVerbosity {
verbose_count,
quiet,
};
let early_config_verbosity = discover_early_config_verbosity();
let verbosity = match resolve_verbosity(
cli_verbosity,
|key| std::env::var(key).ok(),
&early_config_verbosity,
) {
Ok(level) => level,
Err(env_err) => {
let mut stderr = StandardStream::stderr(cabin_diagnostics::termcolor_choice(color));
let _ = write_plain_error(&mut stderr, &env_err.to_string());
return Err(ExitCode::FAILURE);
}
};
let reporter = Reporter::with_color(verbosity, color);
Ok(EarlyTerminalState { color, reporter })
}