use std::path::PathBuf;
pub fn default_registry_path() -> PathBuf {
config_dir().join("workspaces.toml")
}
pub fn default_policies_path() -> PathBuf {
config_dir().join("policies.toml")
}
pub fn default_index_path() -> PathBuf {
data_dir().join("index.db")
}
pub fn is_wsl() -> bool {
if std::env::var_os("WSL_DISTRO_NAME").is_some() {
return true;
}
std::path::Path::new("/proc/sys/fs/binfmt_misc/WSLInterop").exists()
}
fn config_dir() -> PathBuf {
#[cfg(target_os = "macos")]
{
home_dir()
.join("Library")
.join("Application Support")
.join("vfa")
}
#[cfg(not(target_os = "macos"))]
{
if let Some(xdg) = std::env::var_os("XDG_CONFIG_HOME") {
PathBuf::from(xdg).join("vfa")
} else {
home_dir().join(".config").join("vfa")
}
}
}
fn data_dir() -> PathBuf {
#[cfg(target_os = "macos")]
{
home_dir()
.join("Library")
.join("Application Support")
.join("vfa")
}
#[cfg(not(target_os = "macos"))]
{
if let Some(xdg) = std::env::var_os("XDG_DATA_HOME") {
PathBuf::from(xdg).join("vfa")
} else {
home_dir().join(".local").join("share").join("vfa")
}
}
}
fn home_dir() -> PathBuf {
std::env::var_os("HOME")
.map(PathBuf::from)
.unwrap_or_else(|| PathBuf::from("/tmp"))
}
#[cfg(test)]
mod tests {
use super::*;
use std::env;
#[test]
fn registry_path_ends_with_workspaces_toml() {
let p = default_registry_path();
assert_eq!(p.file_name().unwrap(), "workspaces.toml");
}
#[test]
fn policies_path_ends_with_policies_toml() {
let p = default_policies_path();
assert_eq!(p.file_name().unwrap(), "policies.toml");
}
#[test]
fn index_path_ends_with_index_db() {
let p = default_index_path();
assert_eq!(p.file_name().unwrap(), "index.db");
}
#[cfg(not(target_os = "macos"))]
#[test]
fn xdg_config_home_overrides_config_dir() {
let old = env::var_os("XDG_CONFIG_HOME");
unsafe {
env::set_var("XDG_CONFIG_HOME", "/custom/config");
}
let p = default_registry_path();
unsafe {
match &old {
Some(v) => env::set_var("XDG_CONFIG_HOME", v),
None => env::remove_var("XDG_CONFIG_HOME"),
}
}
assert!(
p.starts_with("/custom/config"),
"XDG_CONFIG_HOME should override config dir; got {p:?}"
);
}
#[cfg(not(target_os = "macos"))]
#[test]
fn xdg_data_home_overrides_data_dir() {
let old = env::var_os("XDG_DATA_HOME");
unsafe {
env::set_var("XDG_DATA_HOME", "/custom/data");
}
let p = default_index_path();
unsafe {
match &old {
Some(v) => env::set_var("XDG_DATA_HOME", v),
None => env::remove_var("XDG_DATA_HOME"),
}
}
assert!(
p.starts_with("/custom/data"),
"XDG_DATA_HOME should override data dir; got {p:?}"
);
}
#[cfg(target_os = "macos")]
#[test]
fn macos_registry_path_under_library() {
let p = default_registry_path();
let s = p.to_string_lossy();
assert!(
s.contains("Library/Application Support/vfa"),
"macOS path should be under Library/Application Support/vfa; got {p:?}"
);
}
#[test]
fn is_wsl_returns_bool_without_panic() {
let _ = is_wsl();
}
#[test]
fn is_wsl_detects_wsl_distro_name_env() {
let had_it = env::var_os("WSL_DISTRO_NAME").is_some();
if had_it {
assert!(is_wsl());
} else {
unsafe {
env::set_var("WSL_DISTRO_NAME", "Ubuntu");
}
let result = is_wsl();
unsafe {
env::remove_var("WSL_DISTRO_NAME");
}
assert!(result, "WSL_DISTRO_NAME should trigger is_wsl");
}
}
#[test]
fn all_default_paths_are_absolute() {
if env::var_os("HOME").is_some() {
assert!(default_registry_path().is_absolute());
assert!(default_policies_path().is_absolute());
assert!(default_index_path().is_absolute());
}
}
}