use std::{borrow::Cow, env, sync::LazyLock};
pub static ENVIRON: LazyLock<Environment> = LazyLock::new(Environment::new);
pub struct Environment<'a> {
pub desktop: Cow<'a, str>,
pub home: Cow<'a, str>,
pub pkg_name: Cow<'a, str>,
}
impl Environment<'_> {
pub fn new() -> Environment<'static> {
let home: String = get_home();
let desktop: String = get_desktop();
let pkg_name: String = get_pkg_name("wallswitch");
Environment {
desktop: Cow::Owned(desktop),
home: Cow::Owned(home),
pkg_name: Cow::Owned(pkg_name),
}
}
pub fn get_desktop(&self) -> &str {
&self.desktop
}
pub fn get_home(&self) -> &str {
&self.home
}
pub fn get_pkg_name(&self) -> &str {
&self.pkg_name
}
}
fn get_home() -> String {
match env::var("HOME") {
Ok(home) => home,
Err(why) => {
eprintln!("echo $HOME");
panic!("Error: Unable to get home path! {why}");
}
}
}
fn get_desktop() -> String {
let mut desktops: Vec<String> = Vec::new();
for key in [
"XDG_CURRENT_DESKTOP",
"XDG_SESSION_DESKTOP",
"DESKTOP_SESSION",
] {
if let Ok(desktop) = env::var(key) {
desktops.push(desktop.trim().to_lowercase());
}
}
desktops.sort_by_key(|desktop| desktop.chars().count());
match desktops.last() {
Some(desktop) => desktop.to_string(),
None => panic!("Error: Unable to get desktop type!"),
}
}
fn get_pkg_name(default_name: &str) -> String {
match env::var("CARGO_PKG_NAME") {
Ok(cargo_pkg_name) => cargo_pkg_name,
Err(_) => default_name.to_string(),
}
}