use std::path::{Path, PathBuf};
use super::{expand_path_with, home_dir};
pub fn resolve(database: Option<&Path>, config_dir: Option<&Path>) -> Option<PathBuf> {
resolve_with_home(database, config_dir, home_dir().as_deref())
}
pub(crate) fn resolve_with_home(
database: Option<&Path>,
config_dir: Option<&Path>,
home: Option<&Path>,
) -> Option<PathBuf> {
let raw = database?;
let expanded = expand_path_with(raw, home);
if expanded.is_absolute() {
return Some(expanded);
}
if let Some(dir) = config_dir {
return Some(dir.join(expanded));
}
Some(expanded)
}
pub fn default_path(config_dir: Option<&Path>) -> PathBuf {
match config_dir {
Some(dir) => dir.join("tga.db"),
None => PathBuf::from("tga.db"),
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn database_path_absolute_passes_through() {
let result = resolve(
Some(Path::new("/var/data/tga.db")),
Some(Path::new("/etc/tga")),
);
assert_eq!(result, Some(PathBuf::from("/var/data/tga.db")));
}
#[test]
fn database_path_tilde_expands_and_is_absolute() {
let result = resolve_with_home(
Some(Path::new("~/data/tga.db")),
Some(Path::new("/etc/tga")),
Some(Path::new("/home/testuser")),
);
assert_eq!(result, Some(PathBuf::from("/home/testuser/data/tga.db")));
}
#[test]
fn database_path_tilde_without_home_anchors_to_config_dir() {
let result = resolve_with_home(
Some(Path::new("~/data/tga.db")),
Some(Path::new("/etc/tga")),
None,
);
assert_eq!(result, Some(PathBuf::from("/etc/tga/~/data/tga.db")));
}
#[test]
fn database_path_relative_anchors_to_config_dir() {
let result = resolve(Some(Path::new("data/tga.db")), Some(Path::new("/etc/tga")));
assert_eq!(result, Some(PathBuf::from("/etc/tga/data/tga.db")));
}
#[test]
fn database_path_bare_filename_anchors_to_config_dir() {
let result = resolve(Some(Path::new("tga.db")), Some(Path::new("/home/user")));
assert_eq!(result, Some(PathBuf::from("/home/user/tga.db")));
}
#[test]
fn database_path_relative_no_config_dir_returns_as_is() {
let result = resolve(Some(Path::new("tga.db")), None);
assert_eq!(result, Some(PathBuf::from("tga.db")));
}
#[test]
fn database_path_none_returns_none() {
assert_eq!(resolve(None, Some(Path::new("/etc/tga"))), None);
assert_eq!(resolve(None, None), None);
}
#[test]
fn database_path_default_anchors_to_config_dir() {
let p = default_path(Some(Path::new("/home/user/.config/tga")));
assert_eq!(p, PathBuf::from("/home/user/.config/tga/tga.db"));
}
#[test]
fn database_path_default_bare_when_no_config_dir() {
let p = default_path(None);
assert_eq!(p, PathBuf::from("tga.db"));
}
#[test]
fn config_database_field_parsed_absolute() {
let p = resolve(Some(Path::new("/var/data/tga.db")), None);
assert_eq!(p.as_deref(), Some(Path::new("/var/data/tga.db")));
}
#[test]
fn config_database_field_absent_returns_none() {
assert!(
resolve(None, None).is_none(),
"absent database field must return None"
);
}
}