use super::DirectoryFinder;
use crate::env::Env;
use std::path::PathBuf;
#[derive(Debug, Clone)]
pub struct MacOSGuiDirectoryFinder {
bundle_id: String,
}
impl MacOSGuiDirectoryFinder {
pub fn new(bundle_id: impl Into<String>) -> Self {
Self {
bundle_id: bundle_id.into(),
}
}
fn application_support(&self, env: &dyn Env) -> PathBuf {
env.home_dir().map_or_else(
|| PathBuf::from("/Library/Application Support").join(&self.bundle_id),
|h| {
h.join("Library")
.join("Application Support")
.join(&self.bundle_id)
},
)
}
fn preferences(&self, env: &dyn Env) -> PathBuf {
env.home_dir()
.map_or_else(
|| PathBuf::from("/Library/Preferences"),
|h| h.join("Library").join("Preferences"),
)
.join(format!("{}.plist", self.bundle_id))
}
}
impl DirectoryFinder for MacOSGuiDirectoryFinder {
fn user_dirs(&self, env: &dyn Env) -> Vec<PathBuf> {
vec![
self.application_support(env),
self.preferences(env),
]
}
fn local_dirs(&self, _env: &dyn Env) -> Vec<PathBuf> {
Vec::new()
}
fn system_dirs(&self, _env: &dyn Env) -> Vec<PathBuf> {
vec![
PathBuf::from("/Library/Application Support").join(&self.bundle_id),
PathBuf::from("/Network/Library/Application Support").join(&self.bundle_id),
]
}
}
#[cfg(test)]
mod tests {
use super::*;
struct TestEnv {
home: PathBuf,
}
impl TestEnv {
fn new() -> Self {
Self {
home: PathBuf::from("/Users/testuser"),
}
}
}
impl Env for TestEnv {
fn get(&self, _key: &str) -> Option<String> {
None
}
fn home_dir(&self) -> Option<PathBuf> {
Some(self.home.clone())
}
}
#[test]
fn test_user_dirs() {
let env = TestEnv::new();
let finder = MacOSGuiDirectoryFinder::new("com.example.myapp");
let dirs = finder.user_dirs(&env);
assert_eq!(
dirs[0],
PathBuf::from("/Users/testuser/Library/Application Support/com.example.myapp")
);
assert_eq!(
dirs[1],
PathBuf::from("/Users/testuser/Library/Preferences/com.example.myapp.plist")
);
}
#[test]
fn test_system_dirs() {
let env = TestEnv::new();
let finder = MacOSGuiDirectoryFinder::new("com.example.myapp");
let dirs = finder.system_dirs(&env);
assert_eq!(
dirs[0],
PathBuf::from("/Library/Application Support/com.example.myapp")
);
assert_eq!(
dirs[1],
PathBuf::from("/Network/Library/Application Support/com.example.myapp")
);
}
}