hyprshell_core_lib/
path.rs1use 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
76pub 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
88pub 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
100pub 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}