Skip to content

Commit

Permalink
Add config_local_dir for non-roaming configs to BaseDirs
Browse files Browse the repository at this point in the history
  • Loading branch information
soc committed Mar 19, 2023
1 parent c0253e5 commit 4687d9f
Show file tree
Hide file tree
Showing 4 changed files with 70 additions and 53 deletions.
27 changes: 19 additions & 8 deletions src/lib.rs
Original file line number Diff line number Diff line change
Expand Up @@ -65,14 +65,15 @@ pub struct BaseDirs {
home_dir: PathBuf,

// base directories
cache_dir: PathBuf,
config_dir: PathBuf,
data_dir: PathBuf,
data_local_dir: PathBuf,
executable_dir: Option<PathBuf>,
preference_dir: PathBuf,
runtime_dir: Option<PathBuf>,
state_dir: Option<PathBuf>
cache_dir: PathBuf,
config_dir: PathBuf,
config_local_dir: PathBuf,
data_dir: PathBuf,
data_local_dir: PathBuf,
executable_dir: Option<PathBuf>,
preference_dir: PathBuf,
runtime_dir: Option<PathBuf>,
state_dir: Option<PathBuf>
}

/// `UserDirs` provides paths of user-facing standard directories, following the conventions of the operating system the library is running on.
Expand Down Expand Up @@ -199,6 +200,16 @@ impl BaseDirs {
pub fn config_dir(&self) -> &Path {
self.config_dir.as_path()
}
/// Returns the path to the user's local config directory.
///
/// |Platform | Value | Example |
/// | ------- | ------------------------------------- | ---------------------------------------- |
/// | Linux | `$XDG_CONFIG_HOME` or `$HOME`/.config | /home/alice/.config |
/// | macOS | `$HOME`/Library/Application Support | /Users/Alice/Library/Application Support |
/// | Windows | `{FOLDERID_LocalAppData}` | C:\Users\Alice\AppData\Local |
pub fn config_local_dir(&self) -> &Path {
self.config_local_dir.as_path()
}
/// Returns the path to the user's data directory.
///
/// |Platform | Value | Example |
Expand Down
38 changes: 20 additions & 18 deletions src/lin.rs
Original file line number Diff line number Diff line change
Expand Up @@ -8,26 +8,28 @@ use UserDirs;
use ProjectDirs;

pub fn base_dirs() -> Option<BaseDirs> {
if let Some(home_dir) = dirs_sys::home_dir() {
let cache_dir = env::var_os("XDG_CACHE_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".cache"));
let config_dir = env::var_os("XDG_CONFIG_HOME").and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".config"));
let data_dir = env::var_os("XDG_DATA_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/share"));
let data_local_dir = data_dir.clone();
let preference_dir = config_dir.clone();
let runtime_dir = env::var_os("XDG_RUNTIME_DIR").and_then(dirs_sys::is_absolute_path);
let state_dir = env::var_os("XDG_STATE_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/state"));
let executable_dir = env::var_os("XDG_BIN_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/bin"));
if let Some(home_dir) = dirs_sys::home_dir() {
let cache_dir = env::var_os("XDG_CACHE_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".cache"));
let config_dir = env::var_os("XDG_CONFIG_HOME").and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".config"));
let config_local_dir = config_dir.clone();
let data_dir = env::var_os("XDG_DATA_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/share"));
let data_local_dir = data_dir.clone();
let preference_dir = config_dir.clone();
let runtime_dir = env::var_os("XDG_RUNTIME_DIR").and_then(dirs_sys::is_absolute_path);
let state_dir = env::var_os("XDG_STATE_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/state"));
let executable_dir = env::var_os("XDG_BIN_HOME") .and_then(dirs_sys::is_absolute_path).unwrap_or_else(|| home_dir.join(".local/bin"));

let base_dirs = BaseDirs {
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: Some(executable_dir),
preference_dir: preference_dir,
runtime_dir: runtime_dir,
state_dir: Some(state_dir)
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
config_local_dir: config_local_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: Some(executable_dir),
preference_dir: preference_dir,
runtime_dir: runtime_dir,
state_dir: Some(state_dir)
};
Some(base_dirs)
} else {
Expand Down
32 changes: 17 additions & 15 deletions src/mac.rs
Original file line number Diff line number Diff line change
Expand Up @@ -7,23 +7,25 @@ use UserDirs;
use ProjectDirs;

pub fn base_dirs() -> Option<BaseDirs> {
if let Some(home_dir) = dirs_sys::home_dir() {
let cache_dir = home_dir.join("Library/Caches");
let config_dir = home_dir.join("Library/Application Support");
let data_dir = home_dir.join("Library/Application Support");
let data_local_dir = data_dir.clone();
let preference_dir = home_dir.join("Library/Preferences");
if let Some(home_dir) = dirs_sys::home_dir() {
let cache_dir = home_dir.join("Library/Caches");
let config_dir = home_dir.join("Library/Application Support");
let config_local_dir = config_dir.clone();
let data_dir = config_dir.clone();
let data_local_dir = config_dir.clone();
let preference_dir = home_dir.join("Library/Preferences");

let base_dirs = BaseDirs {
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: None,
preference_dir: preference_dir,
runtime_dir: None,
state_dir: None
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
config_local_dir: config_local_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: None,
preference_dir: preference_dir,
runtime_dir: None,
state_dir: None
};
Some(base_dirs)
} else {
Expand Down
26 changes: 14 additions & 12 deletions src/win.rs
Original file line number Diff line number Diff line change
Expand Up @@ -12,20 +12,22 @@ pub fn base_dirs() -> Option<BaseDirs> {
let data_dir = dirs_sys::known_folder_roaming_app_data();
let data_local_dir = dirs_sys::known_folder_local_app_data();
if let (Some(home_dir), Some(data_dir), Some(data_local_dir)) = (home_dir, data_dir, data_local_dir) {
let cache_dir = data_local_dir.clone();
let config_dir = data_dir.clone();
let preference_dir = data_dir.clone();
let cache_dir = data_local_dir.clone();
let config_dir = data_dir.clone();
let config_local_dir = data_local_dir.clone();
let preference_dir = data_dir.clone();

let base_dirs = BaseDirs {
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: None,
preference_dir: preference_dir,
runtime_dir: None,
state_dir: None
home_dir: home_dir,
cache_dir: cache_dir,
config_dir: config_dir,
config_local_dir: config_local_dir,
data_dir: data_dir,
data_local_dir: data_local_dir,
executable_dir: None,
preference_dir: preference_dir,
runtime_dir: None,
state_dir: None
};
Some(base_dirs)
} else {
Expand Down

0 comments on commit 4687d9f

Please sign in to comment.