use std::path::PathBuf;
const MCPR_DB_ENV: &str = "MCPR_DB";
const DB_FILENAME: &str = "store.db";
pub fn resolve_db_path(config_path: Option<&str>) -> Option<PathBuf> {
if let Some(p) = config_path {
return Some(PathBuf::from(p));
}
if let Ok(p) = std::env::var(MCPR_DB_ENV)
&& !p.is_empty()
{
return Some(PathBuf::from(p));
}
dirs::home_dir().map(|h| h.join(".mcpr").join(DB_FILENAME))
}
pub fn ensure_parent_dir(path: &std::path::Path) -> std::io::Result<()> {
if let Some(parent) = path.parent() {
std::fs::create_dir_all(parent)?;
}
Ok(())
}
#[cfg(test)]
#[allow(non_snake_case)]
mod tests {
use super::*;
#[test]
fn resolve_db_path__explicit_config_wins() {
let result = resolve_db_path(Some("/custom/path/my.db"));
assert_eq!(result, Some(PathBuf::from("/custom/path/my.db")));
}
#[test]
fn resolve_db_path__platform_default_returns_some() {
let result = resolve_db_path(None);
assert!(result.is_some());
let path = result.unwrap();
assert!(path.to_str().unwrap().contains(".mcpr"));
assert!(path.to_str().unwrap().ends_with("store.db"));
}
#[test]
fn ensure_parent_dir__creates_dirs() {
let dir = tempfile::tempdir().unwrap();
let db_path = dir.path().join("sub").join("dir").join("mcpr.db");
assert!(!db_path.parent().unwrap().exists());
ensure_parent_dir(&db_path).unwrap();
assert!(db_path.parent().unwrap().exists());
}
}