devbrain 0.2.0

Local-first CLI to capture, search, and recall developer workflow (commands, errors, and fixes)
use crate::error::DevbrainError;
use std::env;
use std::path::PathBuf;

pub const DEFAULT_DB_PATH: &str = "~/.devbrain/db.json";
pub const DEFAULT_PRESETS_PATH: &str = "~/.devbrain/presets.json";

#[derive(Clone)]
pub struct Config {
    pub db_path: PathBuf,
    pub presets_path: PathBuf,
}

pub fn load_config() -> Result<Config, DevbrainError> {
    if let Ok(path) = env::var("DEVBRAIN_DB_PATH") {
        let db_path = PathBuf::from(path);
        let presets_path = db_path
            .parent()
            .map(|parent| parent.join("presets.json"))
            .unwrap_or_else(|| PathBuf::from(DEFAULT_PRESETS_PATH));

        return Ok(Config {
            db_path,
            presets_path,
        });
    }

    let home = env::var_os("HOME")
        .map(PathBuf::from)
        .ok_or_else(|| DevbrainError::Other("HOME directory not found".to_string()))?;

    let db_path = if let Some(stripped) = DEFAULT_DB_PATH.strip_prefix("~/") {
        home.join(stripped)
    } else {
        PathBuf::from(DEFAULT_DB_PATH)
    };

    let presets_path = if let Some(stripped) = DEFAULT_PRESETS_PATH.strip_prefix("~/") {
        home.join(stripped)
    } else {
        PathBuf::from(DEFAULT_PRESETS_PATH)
    };

    Ok(Config {
        db_path,
        presets_path,
    })
}