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