Skip to main content

zagens_runtime/cli/
context.rs

1//! CLI config / workspace resolution shared by dispatch and handlers.
2
3use std::path::{Path, PathBuf};
4
5use anyhow::Result;
6
7use super::args::Cli;
8use super::setup::merge_project_config;
9use crate::config::Config;
10
11#[derive(Debug, Clone)]
12pub struct CliContext {
13    pub config: Config,
14    pub workspace: PathBuf,
15}
16
17pub fn resolve_workspace(cli: &Cli) -> PathBuf {
18    cli.workspace
19        .clone()
20        .unwrap_or_else(|| std::env::current_dir().unwrap_or_else(|_| PathBuf::from(".")))
21}
22
23pub fn load_cli_context(cli: &Cli) -> Result<CliContext> {
24    let profile = cli
25        .profile
26        .clone()
27        .or_else(|| std::env::var("DEEPSEEK_PROFILE").ok());
28    let mut config = Config::load(cli.config.clone(), profile.as_deref())?;
29    cli.feature_toggles.apply(&mut config)?;
30    let workspace = resolve_workspace(cli);
31    if !cli.no_project_config {
32        merge_project_config(&mut config, &workspace);
33    }
34    Ok(CliContext { config, workspace })
35}
36
37pub fn config_path_for_report(cli: &Cli) -> PathBuf {
38    cli.config.clone().unwrap_or_else(default_config_path)
39}
40
41pub fn default_config_path() -> PathBuf {
42    std::env::var("DEEPSEEK_CONFIG_PATH")
43        .ok()
44        .map(PathBuf::from)
45        .unwrap_or_else(|| {
46            zagens_config::user_data_path("config.toml")
47                .unwrap_or_else(|_| PathBuf::from("config.toml"))
48        })
49}
50
51pub fn display_path(path: &Path) -> String {
52    crate::utils::display_path(path)
53}