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.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
75/// # Panics
76/// if neither `XDG_DATA_HOME` nor HOME is set
77pub 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
87/// # Panics
88/// if neither `XDG_CACHE_HOME` nor HOME is set
89pub 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
99/// # Panics
100/// if neither `XDG_CONFIG_HOME` nor HOME is set
101pub 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}