cliban-core 0.15.0

cliban storage + domain layer: rusqlite store + writer thread + domain contexts
Documentation
//! XDG-aware paths for the cliban SQLite DB and config.

use std::path::PathBuf;

/// `$XDG_DATA_HOME/cliban`, falling back to `~/.local/share/cliban`.
pub fn data_dir() -> PathBuf {
    match std::env::var("XDG_DATA_HOME") {
        Ok(val) if !val.is_empty() => PathBuf::from(val).join("cliban"),
        _ => home_dir().join(".local").join("share").join("cliban"),
    }
}

/// `$XDG_CONFIG_HOME/cliban`, falling back to `~/.config/cliban`.
///
/// Separate from [`data_dir`] on purpose: the database is state a user would
/// back up, config is something they would put in a dotfiles repo. Nothing in
/// here is required — every consumer has working defaults.
pub fn config_dir() -> PathBuf {
    match std::env::var("XDG_CONFIG_HOME") {
        Ok(val) if !val.is_empty() => PathBuf::from(val).join("cliban"),
        _ => home_dir().join(".config").join("cliban"),
    }
}

/// `$CLIBAN_DB` if set, otherwise `data_dir()/cliban.db`.
pub fn db_path() -> PathBuf {
    match std::env::var("CLIBAN_DB") {
        Ok(val) if !val.is_empty() => PathBuf::from(val),
        _ => data_dir().join("cliban.db"),
    }
}

/// Reads `$HOME`.
pub fn home_dir() -> PathBuf {
    match std::env::var("HOME") {
        Ok(val) if !val.is_empty() => PathBuf::from(val),
        _ => PathBuf::from("/"),
    }
}