use std::path::{Path, PathBuf};
use super::expand_path;
pub fn resolve(database: Option<&Path>, config_dir: Option<&Path>) -> Option<PathBuf> {
let raw = database?;
let expanded = expand_path(raw);
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 original = std::env::var_os("HOME");
std::env::set_var("HOME", "/home/testuser");
let result = resolve(
Some(Path::new("~/data/tga.db")),
Some(Path::new("/etc/tga")),
);
match original {
Some(v) => std::env::set_var("HOME", v),
None => std::env::remove_var("HOME"),
}
assert_eq!(result, Some(PathBuf::from("/home/testuser/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"
);
}
}