Skip to main content

the_code_graph_cli/commands/
helpers.rs

1use crate::adapters::fs::RealFileSystem;
2use crate::adapters::git::ShellGitProvider;
3use crate::adapters::parse::RayonParseProvider;
4use crate::project::find_project_root;
5use domain::error::{CodeGraphError, Result};
6use domain::model::Confidence;
7use std::path::PathBuf;
8use storage::SqliteStore;
9
10pub fn open_graph() -> Result<(SqliteStore, PathBuf)> {
11    let cwd = std::env::current_dir().map_err(|e| CodeGraphError::FileSystem {
12        path: ".".into(),
13        source: e,
14    })?;
15    let root = find_project_root(&cwd)?;
16    let db_path = root.join(".code-graph").join("graph.db");
17    if !db_path.exists() {
18        return Err(CodeGraphError::IndexNotBuilt);
19    }
20    let store = SqliteStore::open(&db_path).map_err(|e| CodeGraphError::Storage(format!("{e}")))?;
21
22    // Lazy freshness check — skips if daemon is running
23    let data_dir = root.join(".code-graph");
24    let fs = RealFileSystem;
25    let git = ShellGitProvider::new(root.clone());
26    let parser = RayonParseProvider::new();
27    if let Err(e) = watch::freshness::ensure_fresh(&store, &parser, &fs, &git, &root, &data_dir) {
28        tracing::debug!("freshness check skipped: {e}");
29    }
30
31    Ok((store, root))
32}
33
34pub fn parse_confidence(s: &str) -> Result<Confidence> {
35    match s.to_ascii_lowercase().as_str() {
36        "high" => Ok(Confidence::High),
37        "medium" => Ok(Confidence::Medium),
38        "low" => Ok(Confidence::Low),
39        "all" => Ok(Confidence::Structural),
40        _ => Err(CodeGraphError::Other(format!(
41            "invalid confidence level: {s} (expected: high, medium, low, all)"
42        ))),
43    }
44}