refactor(cli): narrow base context construction

This commit is contained in:
Bryan Helmkamp 2026-04-23 07:33:21 -04:00
parent b794ec5343
commit 4fa5896d78
No known key found for this signature in database
2 changed files with 49 additions and 26 deletions

View file

@ -37,6 +37,47 @@ pub(crate) struct CommandContext {
server: OnceCell<Arc<Client>>,
}
pub(crate) struct ResolvedBaseContext {
printer: Printer,
process_local_json: bool,
cli_layer: CliLayer,
machine_settings: SettingsLayer,
user_settings: UserSettings,
}
impl ResolvedBaseContext {
pub(crate) fn from_disk(cli_layer: &CliLayer, process_local_json: bool) -> Result<Self> {
let (machine_settings, user_settings) = load_merged_settings(cli_layer, &ServerMode::None)?;
let printer = crate::args::printer_from_verbosity(user_settings.cli.output.verbosity);
Ok(Self {
printer,
process_local_json,
cli_layer: cli_layer.clone(),
machine_settings,
user_settings,
})
}
pub(crate) fn printer(&self) -> Printer {
self.printer
}
pub(crate) fn user_settings(&self) -> &UserSettings {
&self.user_settings
}
pub(crate) fn to_context(&self) -> Result<CommandContext> {
CommandContext::base_with_settings(
self.printer,
&self.cli_layer,
self.process_local_json,
self.machine_settings.clone(),
self.user_settings.clone(),
)
}
}
impl CommandContext {
pub(crate) fn base(
printer: Printer,
@ -53,7 +94,7 @@ impl CommandContext {
)
}
pub(crate) fn base_with_settings(
fn base_with_settings(
printer: Printer,
cli_layer: &CliLayer,
process_local_json: bool,

View file

@ -24,12 +24,10 @@ use std::ffi::OsString;
use anyhow::Result;
use args::{
Commands, GlobalArgs, LONG_VERSION, RunCommands, ServerCommand, ServerNamespace,
global_args_cli_layer, printer_from_verbosity, require_no_json_override,
global_args_cli_layer, require_no_json_override,
};
use clap::{CommandFactory, Parser};
use fabro_config::merge::combine_files;
use fabro_telemetry::{git, panic as tel_panic, sanitize, sender};
use fabro_types::settings::SettingsLayer;
use fabro_util::exit::ExitClass;
use fabro_util::printer::Printer;
use fabro_util::terminal::Styles;
@ -37,7 +35,7 @@ use fabro_util::{browser, exit};
use rustls::crypto::ring::default_provider;
use tracing::debug;
use crate::command_context::CommandContext;
use crate::command_context::ResolvedBaseContext;
#[derive(Parser)]
#[command(name = "fabro", version, long_version = LONG_VERSION)]
@ -166,20 +164,12 @@ async fn main_inner() -> (String, Result<()>) {
Err(err) => return (command_name, Err(err)),
};
let disk_settings = match user_config::load_settings() {
Ok(settings) => settings,
let resolved_base = match ResolvedBaseContext::from_disk(&cli_layer, process_local_json) {
Ok(resolved) => resolved,
Err(err) => return (command_name, Err(err)),
};
let machine_settings = combine_files(disk_settings, SettingsLayer {
cli: Some(cli_layer.clone()),
..SettingsLayer::default()
});
let user_settings = match fabro_config::UserSettings::from_layer(&machine_settings) {
Ok(settings) => settings,
Err(err) => return (command_name, Err(err.into())),
};
let cli_settings = user_settings.cli.clone();
let printer = printer_from_verbosity(cli_settings.output.verbosity);
let cli_settings = resolved_base.user_settings().cli.clone();
let printer = resolved_base.printer();
let config_log_level = match &pre_tracing_bootstrap.sink {
logging::InternalLogSink::Cli => cli_settings.logging.level.clone(),
@ -212,15 +202,7 @@ async fn main_inner() -> (String, Result<()>) {
};
let result = Box::pin(async move {
let build_base_ctx = || {
CommandContext::base_with_settings(
printer,
&cli_layer,
process_local_json,
machine_settings.clone(),
user_settings.clone(),
)
};
let build_base_ctx = || resolved_base.to_context();
match *command {
Commands::Exec(args) => commands::exec::execute(args, &cli_settings, printer).await?,