use std::path::PathBuf;
pub fn trust_store_dir() -> PathBuf {
if let Ok(override_dir) = std::env::var("JACS_TRUST_STORE_DIR")
&& !override_dir.trim().is_empty()
{
return PathBuf::from(override_dir);
}
#[cfg(target_os = "macos")]
{
if let Some(home) = dirs::home_dir() {
return home.join("Library/Application Support/jacs/trusted_agents");
}
}
#[cfg(target_os = "linux")]
{
if let Ok(xdg_data) = std::env::var("XDG_DATA_HOME") {
return PathBuf::from(xdg_data).join("jacs/trusted_agents");
}
if let Some(home) = dirs::home_dir() {
return home.join(".local/share/jacs/trusted_agents");
}
}
#[cfg(target_os = "windows")]
{
if let Some(appdata) = dirs::data_dir() {
return appdata.join("jacs\\trusted_agents");
}
}
if let Some(home) = dirs::home_dir() {
return home.join(".jacs/trusted_agents");
}
PathBuf::from("./.jacs/trusted_agents")
}
pub fn data_dir() -> PathBuf {
#[cfg(target_os = "macos")]
{
if let Some(home) = dirs::home_dir() {
return home.join("Library/Application Support/jacs/data");
}
}
#[cfg(target_os = "linux")]
{
if let Ok(xdg_data) = std::env::var("XDG_DATA_HOME") {
return PathBuf::from(xdg_data).join("jacs/data");
}
if let Some(home) = dirs::home_dir() {
return home.join(".local/share/jacs/data");
}
}
#[cfg(target_os = "windows")]
{
if let Some(appdata) = dirs::data_dir() {
return appdata.join("jacs\\data");
}
}
if let Some(home) = dirs::home_dir() {
return home.join(".jacs/data");
}
PathBuf::from("./.jacs/data")
}
pub fn keys_dir() -> PathBuf {
#[cfg(target_os = "macos")]
{
if let Some(home) = dirs::home_dir() {
return home.join("Library/Application Support/jacs/keys");
}
}
#[cfg(target_os = "linux")]
{
if let Ok(xdg_data) = std::env::var("XDG_DATA_HOME") {
return PathBuf::from(xdg_data).join("jacs/keys");
}
if let Some(home) = dirs::home_dir() {
return home.join(".local/share/jacs/keys");
}
}
#[cfg(target_os = "windows")]
{
if let Some(appdata) = dirs::data_dir() {
return appdata.join("jacs\\keys");
}
}
if let Some(home) = dirs::home_dir() {
return home.join(".jacs/keys");
}
PathBuf::from("./.jacs/keys")
}
pub fn default_config_path() -> PathBuf {
PathBuf::from("./jacs.config.json")
}
pub fn default_agent_path() -> PathBuf {
PathBuf::from("./jacs.agent.json")
}
pub fn local_keys_dir() -> PathBuf {
PathBuf::from("./jacs_keys")
}
pub fn local_data_dir() -> PathBuf {
PathBuf::from("./jacs_data")
}
pub fn ensure_dir_exists(path: &PathBuf) -> Result<&PathBuf, crate::error::JacsError> {
if !path.exists() {
std::fs::create_dir_all(path).map_err(|e| {
let suggestion = match e.kind() {
std::io::ErrorKind::PermissionDenied => {
" Check that you have write permissions for the parent directory."
}
std::io::ErrorKind::NotFound => " The parent directory path may be invalid.",
_ => "",
};
format!(
"Failed to create directory '{}': {}.{}",
path.display(),
e,
suggestion
)
})?;
}
Ok(path)
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_trust_store_dir_is_valid() {
let path = trust_store_dir();
assert!(
path.to_string_lossy().contains("trusted_agents"),
"Trust store path should contain 'trusted_agents': {:?}",
path
);
}
#[test]
fn test_default_config_path() {
let path = default_config_path();
assert_eq!(path, PathBuf::from("./jacs.config.json"));
}
#[test]
fn test_default_agent_path() {
let path = default_agent_path();
assert_eq!(path, PathBuf::from("./jacs.agent.json"));
}
#[test]
fn test_local_keys_dir() {
let path = local_keys_dir();
assert_eq!(path, PathBuf::from("./jacs_keys"));
}
#[test]
fn test_local_data_dir() {
let path = local_data_dir();
assert_eq!(path, PathBuf::from("./jacs_data"));
}
}