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_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    // use .ron as default (for generating)
27    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}