@@ -1,7 +1,11 @@
1−use dirs_rs;
1+use dirs_rs::home_dir;
2+use std::env;
3+use std::ffi::OsString;
24use std::path::{Path, PathBuf};
35
4−/// Wrapper for dirs that uses `~/.config/bat` for MacOS.
6+/// Wrapper for dirs that treats MacOS more like Linux.
7+/// First, env variables `XDG_CACHE_HOME` and `XDG_CONFIG_HOME` are checked and the fall back is
8+/// `~/.cache/bat` and `~/.config/bat`.
59pub struct BatProjectDirs {
610 cache_dir: PathBuf,
711 config_dir: PathBuf,
@@ -10,32 +14,28 @@ pub struct BatProjectDirs {
1014impl BatProjectDirs {
1115 fn new() -> Option<BatProjectDirs> {
1216 #[cfg(target_os = "macos")]
13− let cache_dir = match dirs_rs::home_dir() {
14− Some(mut d) => {
15− d.push(".cache/bat");
16− d
17− }
18− None => return None,
19− };
17+ let cache_dir_op = env::var_os("XDG_CACHE_HOME")
18+ .and_then(is_absolute_path)
19+ .or_else(|| home_dir().map(|d| d.join(".cache")));
2020
2121 #[cfg(not(target_os = "macos"))]
22− let cache_dir = match dirs_rs::cache_dir() {
23− Some(d) => d,
22+ let cache_dir_op = dirs_rs::cache_dir();
23+
24+ let cache_dir = match cache_dir_op {
25+ Some(d) => d.join("bat"),
2426 None => return None,
2527 };
2628
2729 #[cfg(target_os = "macos")]
28− let config_dir = match dirs_rs::home_dir() {
29− Some(mut d) => {
30− d.push(".config/bat");
31− d
32− }
33− None => return None,
34− };
30+ let config_dir_op = env::var_os("XDG_CONFIG_HOME")
31+ .and_then(is_absolute_path)
32+ .or_else(|| home_dir().map(|d| d.join(".config")));
3533
3634 #[cfg(not(target_os = "macos"))]
37− let config_dir = match dirs_rs::config_dir() {
38− Some(d) => d,
35+ let config_dir_op = dirs_rs::config_dir();
36+
37+ let config_dir = match config_dir_op {
38+ Some(d) => d.join("bat"),
3939 None => return None,
4040 };
4141
@@ -54,6 +54,16 @@ impl BatProjectDirs {
5454 }
5555}
5656
57+// Returns path if it is an absolute path
58+fn is_absolute_path(path: OsString) -> Option<PathBuf> {
59+ let path = PathBuf::from(path);
60+ if path.is_absolute() {
61+ Some(path)
62+ } else {
63+ None
64+ }
65+}
66+
5767lazy_static! {
5868 pub static ref PROJECT_DIRS: BatProjectDirs =
5969 BatProjectDirs::new().expect("Could not get home directory");