hyprshell_core_lib/
path.rs

1use std::env;
2use std::path::PathBuf;
3use tracing::{trace, warn};
4
5pub fn get_default_config_path() -> PathBuf {
6    let mut path = get_config_home();
7    #[cfg(debug_assertions)]
8    path.push("hyprshell.debug/");
9    #[cfg(not(debug_assertions))]
10    path.push("hyprshell/");
11    path.push("config.ron");
12
13    if path.exists() {
14        trace!("Found config file at {path:?}");
15        return path;
16    }
17
18    path.set_extension("toml");
19    if path.exists() {
20        trace!("Found config file at {path:?}");
21        return path;
22    }
23
24    path.set_extension("json");
25    if path.exists() {
26        trace!("Found config file at {path:?}");
27        return path;
28    }
29
30    #[cfg(feature = "json5_config")]
31    {
32        path.set_extension("json5");
33        if path.exists() {
34            trace!("Found config file at {path:?}");
35            return path;
36        }
37    }
38
39    path.set_extension("ron");
40    path
41}
42
43#[must_use]
44pub fn get_default_css_path() -> PathBuf {
45    let mut path = get_config_home();
46
47    #[cfg(debug_assertions)]
48    path.push("hyprshell.debug/styles.css");
49    #[cfg(not(debug_assertions))]
50    path.push("hyprshell/styles.css");
51    path
52}
53
54#[must_use]
55pub fn get_default_data_dir() -> PathBuf {
56    let mut path = get_data_home();
57
58    #[cfg(debug_assertions)]
59    path.push("hyprshell.debug");
60    #[cfg(not(debug_assertions))]
61    path.push("hyprshell");
62    path
63}
64
65#[must_use]
66pub fn get_default_cache_dir() -> PathBuf {
67    let mut path = get_cache_home();
68
69    #[cfg(debug_assertions)]
70    path.push("hyprshell.debug");
71    #[cfg(not(debug_assertions))]
72    path.push("hyprshell");
73    path
74}
75
76/// # Panics
77/// if neither `XDG_DATA_HOME` nor HOME is set
78pub fn get_data_home() -> PathBuf {
79    env::var_os("XDG_DATA_HOME")
80        .map(PathBuf::from)
81        .or_else(|| {
82            env::var_os("HOME")
83                .map(|home| PathBuf::from(format!("{}/.local/share", home.to_string_lossy())))
84        })
85        .expect("Failed to get config dir (XDG_DATA_HOME or HOME not set)")
86}
87
88/// # Panics
89/// if neither `XDG_CACHE_HOME` nor HOME is set
90pub fn get_cache_home() -> PathBuf {
91    env::var_os("XDG_CACHE_HOME")
92        .map(PathBuf::from)
93        .or_else(|| {
94            env::var_os("HOME")
95                .map(|home| PathBuf::from(format!("{}/.cache", home.to_string_lossy())))
96        })
97        .expect("Failed to get config dir (XDG_CACHE_HOME or HOME not set)")
98}
99
100/// # Panics
101/// if neither `XDG_CONFIG_HOME` nor HOME is set
102pub fn get_config_home() -> PathBuf {
103    env::var_os("XDG_CONFIG_HOME")
104        .map(PathBuf::from)
105        .or_else(|| {
106            env::var_os("HOME")
107                .map(|home| PathBuf::from(format!("{}/.config", home.to_string_lossy())))
108        })
109        .expect("Failed to get config dir (XDG_CONFIG_HOME or HOME not set)")
110}
111
112#[must_use]
113pub fn get_config_dirs() -> Vec<PathBuf> {
114    env::var_os("XDG_CONFIG_DIRS").map_or_else(
115        || vec![PathBuf::from("/etc/xdg/")],
116        |val| env::split_paths(&val).collect(),
117    )
118}
119
120#[must_use]
121pub fn get_data_dirs() -> Vec<PathBuf> {
122    let mut dirs = env::var_os("XDG_DATA_DIRS").map_or_else(
123        || {
124            vec![
125                PathBuf::from("/usr/local/share"),
126                PathBuf::from("/usr/share"),
127            ]
128        },
129        |val| env::split_paths(&val).collect(),
130    );
131
132    if let Some(data_home) = env::var_os("XDG_DATA_HOME").map(PathBuf::from).map_or_else(
133        || {
134            env::var_os("HOME")
135                .map(|p| PathBuf::from(p).join(".local/share"))
136                .or_else(|| {
137                    warn!("No XDG_DATA_HOME and HOME environment variable found");
138                    None
139                })
140        },
141        Some,
142    ) {
143        dirs.push(data_home);
144    }
145
146    dirs.into_iter()
147        .map(|dir| dir.join("applications"))
148        .collect()
149}