Skip to content
This repository was archived by the owner on Feb 18, 2025. It is now read-only.

Commit a07a619

Browse files
committed
Add config_local_dir for non-roaming configs
1 parent c89b761 commit a07a619

File tree

6 files changed

+111
-92
lines changed

6 files changed

+111
-92
lines changed

README.md

+21-20
Original file line numberDiff line numberDiff line change
@@ -102,26 +102,27 @@ dirs::executable_dir();
102102
**If you want to compute the location of cache, config or data directories for your own application or project,
103103
use `ProjectDirs` of the [directories](https://github.com/dirs-dev/directories-rs) project instead.**
104104

105-
| Function name | Value on Linux/Redox | Value on Windows | Value on macOS |
106-
| ---------------- | ---------------------------------------------------------------------- | --------------------------------- | ------------------------------------------- |
107-
| `home_dir` | `Some($HOME)` | `Some({FOLDERID_Profile})` | `Some($HOME)` |
108-
| `cache_dir` | `Some($XDG_CACHE_HOME)` or `Some($HOME`/.cache`)` | `Some({FOLDERID_LocalAppData})` | `Some($HOME`/Library/Caches`)` |
109-
| `config_dir` | `Some($XDG_CONFIG_HOME)` or `Some($HOME`/.config`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Application Support`)` |
110-
| `data_dir` | `Some($XDG_DATA_HOME)` or `Some($HOME`/.local/share`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Application Support`)` |
111-
| `data_local_dir` | `Some($XDG_DATA_HOME)` or `Some($HOME`/.local/share`)` | `Some({FOLDERID_LocalAppData})` | `Some($HOME`/Library/Application Support`)` |
112-
| `executable_dir` | `Some($XDG_BIN_HOME)` or `Some($HOME`/.local/bin`)` | `None` | `None` |
113-
| `preference_dir` | `Some($XDG_CONFIG_HOME)` or `Some($HOME`/.config`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Preferences`)` |
114-
| `runtime_dir` | `Some($XDG_RUNTIME_DIR)` or `None` | `None` | `None` |
115-
| `state_dir` | `Some($XDG_STATE_HOME)` or `Some($HOME`/.local/state`)` | `None` | `None` |
116-
| `audio_dir` | `Some(XDG_MUSIC_DIR)` or `None` | `Some({FOLDERID_Music})` | `Some($HOME`/Music/`)` |
117-
| `desktop_dir` | `Some(XDG_DESKTOP_DIR)` or `None` | `Some({FOLDERID_Desktop})` | `Some($HOME`/Desktop/`)` |
118-
| `document_dir` | `Some(XDG_DOCUMENTS_DIR)` or `None` | `Some({FOLDERID_Documents})` | `Some($HOME`/Documents/`)` |
119-
| `download_dir` | `Some(XDG_DOWNLOAD_DIR)` or `None` | `Some({FOLDERID_Downloads})` | `Some($HOME`/Downloads/`)` |
120-
| `font_dir` | `Some($XDG_DATA_HOME`/fonts/`)` or `Some($HOME`/.local/share/fonts/`)` | `None` | `Some($HOME`/Library/Fonts/`)` |
121-
| `picture_dir` | `Some(XDG_PICTURES_DIR)` or `None` | `Some({FOLDERID_Pictures})` | `Some($HOME`/Pictures/`)` |
122-
| `public_dir` | `Some(XDG_PUBLICSHARE_DIR)` or `None` | `Some({FOLDERID_Public})` | `Some($HOME`/Public/`)` |
123-
| `template_dir` | `Some(XDG_TEMPLATES_DIR)` or `None` | `Some({FOLDERID_Templates})` | `None` |
124-
| `video_dir` | `Some(XDG_VIDEOS_DIR)` or `None` | `Some({FOLDERID_Videos})` | `Some($HOME`/Movies/`)` |
105+
| Function name | Value on Linux/Redox | Value on Windows | Value on macOS |
106+
|--------------------| ---------------------------------------------------------------------- |-----------------------------------| ------------------------------------------- |
107+
| `home_dir` | `Some($HOME)` | `Some({FOLDERID_Profile})` | `Some($HOME)` |
108+
| `cache_dir` | `Some($XDG_CACHE_HOME)` or `Some($HOME`/.cache`)` | `Some({FOLDERID_LocalAppData})` | `Some($HOME`/Library/Caches`)` |
109+
| `config_dir` | `Some($XDG_CONFIG_HOME)` or `Some($HOME`/.config`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Application Support`)` |
110+
| `config_local_dir` | `Some($XDG_CONFIG_HOME)` or `Some($HOME`/.config`)` | `Some({FOLDERID_LocalAppData})` | `Some($HOME`/Library/Application Support`)` |
111+
| `data_dir` | `Some($XDG_DATA_HOME)` or `Some($HOME`/.local/share`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Application Support`)` |
112+
| `data_local_dir` | `Some($XDG_DATA_HOME)` or `Some($HOME`/.local/share`)` | `Some({FOLDERID_LocalAppData})` | `Some($HOME`/Library/Application Support`)` |
113+
| `executable_dir` | `Some($XDG_BIN_HOME)` or `Some($HOME`/.local/bin`)` | `None` | `None` |
114+
| `preference_dir` | `Some($XDG_CONFIG_HOME)` or `Some($HOME`/.config`)` | `Some({FOLDERID_RoamingAppData})` | `Some($HOME`/Library/Preferences`)` |
115+
| `runtime_dir` | `Some($XDG_RUNTIME_DIR)` or `None` | `None` | `None` |
116+
| `state_dir` | `Some($XDG_STATE_HOME)` or `Some($HOME`/.local/state`)` | `None` | `None` |
117+
| `audio_dir` | `Some(XDG_MUSIC_DIR)` or `None` | `Some({FOLDERID_Music})` | `Some($HOME`/Music/`)` |
118+
| `desktop_dir` | `Some(XDG_DESKTOP_DIR)` or `None` | `Some({FOLDERID_Desktop})` | `Some($HOME`/Desktop/`)` |
119+
| `document_dir` | `Some(XDG_DOCUMENTS_DIR)` or `None` | `Some({FOLDERID_Documents})` | `Some($HOME`/Documents/`)` |
120+
| `download_dir` | `Some(XDG_DOWNLOAD_DIR)` or `None` | `Some({FOLDERID_Downloads})` | `Some($HOME`/Downloads/`)` |
121+
| `font_dir` | `Some($XDG_DATA_HOME`/fonts/`)` or `Some($HOME`/.local/share/fonts/`)` | `None` | `Some($HOME`/Library/Fonts/`)` |
122+
| `picture_dir` | `Some(XDG_PICTURES_DIR)` or `None` | `Some({FOLDERID_Pictures})` | `Some($HOME`/Pictures/`)` |
123+
| `public_dir` | `Some(XDG_PUBLICSHARE_DIR)` or `None` | `Some({FOLDERID_Public})` | `Some($HOME`/Public/`)` |
124+
| `template_dir` | `Some(XDG_TEMPLATES_DIR)` or `None` | `Some({FOLDERID_Templates})` | `None` |
125+
| `video_dir` | `Some(XDG_VIDEOS_DIR)` or `None` | `Some({FOLDERID_Videos})` | `Some($HOME`/Movies/`)` |
125126

126127
## Comparison
127128

src/lib.rs

+12
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,18 @@ pub fn cache_dir() -> Option<PathBuf> {
9898
pub fn config_dir() -> Option<PathBuf> {
9999
sys::config_dir()
100100
}
101+
/// Returns the path to the user's local config directory.
102+
///
103+
/// The returned value depends on the operating system and is either a `Some`, containing a value from the following table, or a `None`.
104+
///
105+
/// |Platform | Value | Example |
106+
/// | ------- | ------------------------------------- | ---------------------------------------- |
107+
/// | Linux | `$XDG_CONFIG_HOME` or `$HOME`/.config | /home/alice/.config |
108+
/// | macOS | `$HOME`/Library/Application Support | /Users/Alice/Library/Application Support |
109+
/// | Windows | `{FOLDERID_LocalAppData}` | C:\Users\Alice\AppData\Local |
110+
pub fn config_local_dir() -> Option<PathBuf> {
111+
sys::config_local_dir()
112+
}
101113
/// Returns the path to the user's data directory.
102114
///
103115
/// The returned value depends on the operating system and is either a `Some`, containing a value from the following table, or a `None`.

src/lin.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,27 @@ extern crate dirs_sys;
33
use std::env;
44
use std::path::PathBuf;
55

6-
pub fn home_dir() -> Option<PathBuf> { dirs_sys::home_dir() }
6+
pub fn home_dir() -> Option<PathBuf> { dirs_sys::home_dir() }
77

8-
pub fn cache_dir() -> Option<PathBuf> { env::var_os("XDG_CACHE_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".cache"))) }
9-
pub fn config_dir() -> Option<PathBuf> { env::var_os("XDG_CONFIG_HOME").and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".config"))) }
10-
pub fn data_dir() -> Option<PathBuf> { env::var_os("XDG_DATA_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/share"))) }
11-
pub fn data_local_dir() -> Option<PathBuf> { data_dir() }
12-
pub fn preference_dir() -> Option<PathBuf> { config_dir() }
13-
pub fn runtime_dir() -> Option<PathBuf> { env::var_os("XDG_RUNTIME_DIR").and_then(dirs_sys::is_absolute_path) }
14-
pub fn state_dir() -> Option<PathBuf> { env::var_os("XDG_STATE_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/state"))) }
15-
pub fn executable_dir() -> Option<PathBuf> { env::var_os("XDG_BIN_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/bin"))) }
8+
pub fn cache_dir() -> Option<PathBuf> { env::var_os("XDG_CACHE_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".cache"))) }
9+
pub fn config_dir() -> Option<PathBuf> { env::var_os("XDG_CONFIG_HOME").and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".config"))) }
10+
pub fn config_local_dir() -> Option<PathBuf> { config_dir() }
11+
pub fn data_dir() -> Option<PathBuf> { env::var_os("XDG_DATA_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/share"))) }
12+
pub fn data_local_dir() -> Option<PathBuf> { data_dir() }
13+
pub fn preference_dir() -> Option<PathBuf> { config_dir() }
14+
pub fn runtime_dir() -> Option<PathBuf> { env::var_os("XDG_RUNTIME_DIR").and_then(dirs_sys::is_absolute_path) }
15+
pub fn state_dir() -> Option<PathBuf> { env::var_os("XDG_STATE_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/state"))) }
16+
pub fn executable_dir() -> Option<PathBuf> { env::var_os("XDG_BIN_HOME") .and_then(dirs_sys::is_absolute_path).or_else(|| home_dir().map(|h| h.join(".local/bin"))) }
1617

17-
pub fn audio_dir() -> Option<PathBuf> { dirs_sys::user_dir("MUSIC") }
18-
pub fn desktop_dir() -> Option<PathBuf> { dirs_sys::user_dir("DESKTOP") }
19-
pub fn document_dir() -> Option<PathBuf> { dirs_sys::user_dir("DOCUMENTS") }
20-
pub fn download_dir() -> Option<PathBuf> { dirs_sys::user_dir("DOWNLOAD") }
21-
pub fn font_dir() -> Option<PathBuf> { data_dir().map(|d| d.join("fonts")) }
22-
pub fn picture_dir() -> Option<PathBuf> { dirs_sys::user_dir("PICTURES") }
23-
pub fn public_dir() -> Option<PathBuf> { dirs_sys::user_dir("PUBLICSHARE") }
24-
pub fn template_dir() -> Option<PathBuf> { dirs_sys::user_dir("TEMPLATES") }
25-
pub fn video_dir() -> Option<PathBuf> { dirs_sys::user_dir("VIDEOS") }
18+
pub fn audio_dir() -> Option<PathBuf> { dirs_sys::user_dir("MUSIC") }
19+
pub fn desktop_dir() -> Option<PathBuf> { dirs_sys::user_dir("DESKTOP") }
20+
pub fn document_dir() -> Option<PathBuf> { dirs_sys::user_dir("DOCUMENTS") }
21+
pub fn download_dir() -> Option<PathBuf> { dirs_sys::user_dir("DOWNLOAD") }
22+
pub fn font_dir() -> Option<PathBuf> { data_dir().map(|d| d.join("fonts")) }
23+
pub fn picture_dir() -> Option<PathBuf> { dirs_sys::user_dir("PICTURES") }
24+
pub fn public_dir() -> Option<PathBuf> { dirs_sys::user_dir("PUBLICSHARE") }
25+
pub fn template_dir() -> Option<PathBuf> { dirs_sys::user_dir("TEMPLATES") }
26+
pub fn video_dir() -> Option<PathBuf> { dirs_sys::user_dir("VIDEOS") }
2627

2728
#[cfg(test)]
2829
mod tests {

src/mac.rs

+21-18
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,26 @@ extern crate dirs_sys;
22

33
use std::path::PathBuf;
44

5-
pub fn home_dir() -> Option<PathBuf> { dirs_sys::home_dir() }
5+
pub fn home_dir() -> Option<PathBuf> { dirs_sys::home_dir() }
66

7-
pub fn cache_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Caches")) }
8-
pub fn config_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Application Support")) }
9-
pub fn data_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Application Support")) }
10-
pub fn data_local_dir() -> Option<PathBuf> { data_dir() }
11-
pub fn preference_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Preferences")) }
12-
pub fn executable_dir() -> Option<PathBuf> { None }
13-
pub fn runtime_dir() -> Option<PathBuf> { None }
14-
pub fn state_dir() -> Option<PathBuf> { None }
7+
fn app_support_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Application Support")) }
158

16-
pub fn audio_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Music")) }
17-
pub fn desktop_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Desktop")) }
18-
pub fn document_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Documents")) }
19-
pub fn download_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Downloads")) }
20-
pub fn font_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Fonts")) }
21-
pub fn picture_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Pictures")) }
22-
pub fn public_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Public")) }
23-
pub fn template_dir() -> Option<PathBuf> { None }
24-
pub fn video_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Movies")) }
9+
pub fn cache_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Caches")) }
10+
pub fn config_dir() -> Option<PathBuf> { app_support_dir() }
11+
pub fn config_local_dir() -> Option<PathBuf> { app_support_dir() }
12+
pub fn data_dir() -> Option<PathBuf> { app_support_dir() }
13+
pub fn data_local_dir() -> Option<PathBuf> { app_support_dir() }
14+
pub fn preference_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Preferences")) }
15+
pub fn executable_dir() -> Option<PathBuf> { None }
16+
pub fn runtime_dir() -> Option<PathBuf> { None }
17+
pub fn state_dir() -> Option<PathBuf> { None }
18+
19+
pub fn audio_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Music")) }
20+
pub fn desktop_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Desktop")) }
21+
pub fn document_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Documents")) }
22+
pub fn download_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Downloads")) }
23+
pub fn font_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Library/Fonts")) }
24+
pub fn picture_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Pictures")) }
25+
pub fn public_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Public")) }
26+
pub fn template_dir() -> Option<PathBuf> { None }
27+
pub fn video_dir() -> Option<PathBuf> { home_dir().map(|h| h.join("Movies")) }

src/wasm.rs

+19-18
Original file line numberDiff line numberDiff line change
@@ -2,23 +2,24 @@
22

33
use std::path::PathBuf;
44

5-
pub fn home_dir() -> Option<PathBuf> { None }
5+
pub fn home_dir() -> Option<PathBuf> { None }
66

7-
pub fn cache_dir() -> Option<PathBuf> { None }
8-
pub fn config_dir() -> Option<PathBuf> { None }
9-
pub fn data_dir() -> Option<PathBuf> { None }
10-
pub fn data_local_dir() -> Option<PathBuf> { None }
11-
pub fn preference_dir() -> Option<PathBuf> { None }
12-
pub fn runtime_dir() -> Option<PathBuf> { None }
13-
pub fn executable_dir() -> Option<PathBuf> { None }
14-
pub fn state_dir() -> Option<PathBuf> { None }
7+
pub fn cache_dir() -> Option<PathBuf> { None }
8+
pub fn config_dir() -> Option<PathBuf> { None }
9+
pub fn config_local_dir() -> Option<PathBuf> { None }
10+
pub fn data_dir() -> Option<PathBuf> { None }
11+
pub fn data_local_dir() -> Option<PathBuf> { None }
12+
pub fn preference_dir() -> Option<PathBuf> { None }
13+
pub fn runtime_dir() -> Option<PathBuf> { None }
14+
pub fn executable_dir() -> Option<PathBuf> { None }
15+
pub fn state_dir() -> Option<PathBuf> { None }
1516

16-
pub fn audio_dir() -> Option<PathBuf> { None }
17-
pub fn desktop_dir() -> Option<PathBuf> { None }
18-
pub fn document_dir() -> Option<PathBuf> { None }
19-
pub fn download_dir() -> Option<PathBuf> { None }
20-
pub fn font_dir() -> Option<PathBuf> { None }
21-
pub fn picture_dir() -> Option<PathBuf> { None }
22-
pub fn public_dir() -> Option<PathBuf> { None }
23-
pub fn template_dir() -> Option<PathBuf> { None }
24-
pub fn video_dir() -> Option<PathBuf> { None }
17+
pub fn audio_dir() -> Option<PathBuf> { None }
18+
pub fn desktop_dir() -> Option<PathBuf> { None }
19+
pub fn document_dir() -> Option<PathBuf> { None }
20+
pub fn download_dir() -> Option<PathBuf> { None }
21+
pub fn font_dir() -> Option<PathBuf> { None }
22+
pub fn picture_dir() -> Option<PathBuf> { None }
23+
pub fn public_dir() -> Option<PathBuf> { None }
24+
pub fn template_dir() -> Option<PathBuf> { None }
25+
pub fn video_dir() -> Option<PathBuf> { None }

0 commit comments

Comments
 (0)