use crate::{WallSwitchError, WallSwitchResult};
use std::{borrow::Cow, env};
pub struct Environment<'a> {
pub desktop: Cow<'a, str>,
pub home: Cow<'a, str>,
pub pkg_name: Cow<'a, str>,
}
impl Environment<'_> {
pub fn fallback() -> Environment<'static> {
Environment {
desktop: Cow::Borrowed("openbox"),
home: Cow::Borrowed("/tmp"),
pkg_name: Cow::Borrowed("wallswitch"),
}
}
pub fn new() -> WallSwitchResult<Environment<'static>> {
let home = fetch_home()?;
let desktop = fetch_desktop()?;
let pkg_name = fetch_pkg_name();
Ok(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 fetch_home() -> WallSwitchResult<String> {
env::var("HOME").map_err(|_| WallSwitchError::EnvVarMissing("HOME".to_string()))
}
fn fetch_pkg_name() -> String {
env::var("CARGO_PKG_NAME").unwrap_or_else(|_| "wallswitch".to_string())
}
fn fetch_desktop() -> WallSwitchResult<String> {
let mut desktops = Vec::new();
for key in [
"XDG_CURRENT_DESKTOP",
"XDG_SESSION_DESKTOP",
"DESKTOP_SESSION",
] {
if let Ok(val) = env::var(key) {
let val = val.trim().to_lowercase();
if !val.is_empty() {
desktops.push(val);
}
}
}
desktops.sort_by_key(|d| d.len());
desktops
.last()
.cloned()
.ok_or(WallSwitchError::DesktopDetectionFailed)
}