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_dir();
7 path.push("hyprshell/config.ron");
8 if path.exists() {
9 trace!("Found config file at {path:?}");
10 return path;
11 }
12 path.set_extension("json");
13 if path.exists() {
14 trace!("Found config file at {path:?}");
15 return path;
16 }
17 #[cfg(feature = "toml_config")]
18 {
19 path.set_extension("toml");
20 if path.exists() {
21 trace!("Found config file at {path:?}");
22 return path;
23 }
24 }
25
26 path
28}
29
30pub fn get_default_css_path() -> PathBuf {
31 let mut path = get_config_dir();
32 path.push("hyprshell/styles.css");
33 path
34}
35
36pub fn get_default_data_dir() -> PathBuf {
37 let mut path = get_data_dir();
38 path.push("hyprshell");
39 path
40}
41
42pub fn get_data_dir() -> PathBuf {
43 env::var_os("XDG_DATA_HOME")
44 .map(PathBuf::from)
45 .or_else(|| {
46 env::var_os("HOME")
47 .map(|home| PathBuf::from(format!("{}/.local/share", home.to_string_lossy())))
48 })
49 .expect("Failed to get config dir (XDG_DATA_HOME or HOME not set)")
50}
51
52pub fn get_config_dir() -> PathBuf {
53 env::var_os("XDG_CONFIG_HOME")
54 .map(PathBuf::from)
55 .or_else(|| {
56 env::var_os("HOME")
57 .map(|home| PathBuf::from(format!("{}/.config", home.to_string_lossy())))
58 })
59 .expect("Failed to get config dir (XDG_CONFIG_HOME or HOME not set)")
60}
61
62pub fn find_config_dirs() -> Vec<PathBuf> {
63 env::var_os("XDG_CONFIG_DIRS")
64 .map(|val| env::split_paths(&val).collect())
65 .unwrap_or_else(|| vec![PathBuf::from("/etc/xdg/")])
66}
67
68pub fn find_application_dirs() -> Vec<PathBuf> {
69 let mut dirs = env::var_os("XDG_DATA_DIRS")
70 .map(|val| env::split_paths(&val).collect())
71 .unwrap_or_else(|| {
72 vec![
73 PathBuf::from("/usr/local/share"),
74 PathBuf::from("/usr/share"),
75 ]
76 });
77
78 if let Some(data_home) = env::var_os("XDG_DATA_HOME").map(PathBuf::from).map_or_else(
79 || {
80 env::var_os("HOME")
81 .map(|p| PathBuf::from(p).join(".local/share"))
82 .or_else(|| {
83 warn!("No XDG_DATA_HOME and HOME environment variable found");
84 None
85 })
86 },
87 Some,
88 ) {
89 dirs.push(data_home)
90 }
91
92 dirs.into_iter()
93 .map(|dir| dir.join("applications"))
94 .collect()
95}