Skip to main content

defect_cli/
paths.rs

1//! Path resolution helpers — session storage root, etc.
2
3use std::env;
4use std::path::{Path, PathBuf};
5
6/// Default session persistence root directory. Priority:
7/// 1. `XDG_STATE_HOME/defect/sessions`
8/// 2. `$HOME/.local/state/defect/sessions`
9///
10/// # Errors
11///
12/// Returns an error when neither `XDG_STATE_HOME` nor `HOME` is set.
13pub fn default_sessions_root() -> anyhow::Result<PathBuf> {
14    if let Ok(xdg_state_home) = env::var("XDG_STATE_HOME") {
15        return Ok(PathBuf::from(xdg_state_home).join("defect/sessions"));
16    }
17    if let Ok(home) = env::var("HOME") {
18        return Ok(PathBuf::from(home).join(".local/state/defect/sessions"));
19    }
20    Err(anyhow::anyhow!(
21        "cannot resolve session storage root: neither XDG_STATE_HOME nor HOME is set"
22    ))
23}
24
25/// Session persistence root directory for `--local` sandbox mode:
26/// `<repo-root>/.defect/sessions`.
27///
28/// The project root is detected via `.git` (same source as the project layer in the
29/// config system); if no `.git` is found, falls back to `cwd/.defect/sessions` so that
30/// sandbox directories without a repository can still be used.
31#[must_use]
32pub fn local_sessions_root(cwd: &Path) -> PathBuf {
33    let root = defect_config::find_repo_root(cwd).unwrap_or_else(|| cwd.to_path_buf());
34    root.join(".defect/sessions")
35}