use lazy_static::lazy_static; use serde::Serialize; use shadow_rs::{is_debug, shadow}; use std::env::current_exe; use std::path::PathBuf; shadow!(build); lazy_static! { pub static ref RESOURCE_PATH: PathBuf = if is_debug() { let project_root = build::CARGO_MANIFEST_DIR.parse::().unwrap(); project_root.join("./tmp/resources") } else { current_exe() .unwrap() .parent() .unwrap() .join("../share/upend") }; pub static ref WEBUI_PATH: PathBuf = RESOURCE_PATH.join("webui"); static ref APP_USER_AGENT: String = format!("upend / {}", build::PKG_VERSION); pub static ref REQWEST_CLIENT: reqwest::blocking::Client = reqwest::blocking::Client::builder() .user_agent(APP_USER_AGENT.as_str()) .build() .unwrap(); pub static ref REQWEST_ASYNC_CLIENT: reqwest::Client = reqwest::Client::builder() .user_agent(APP_USER_AGENT.as_str()) .build() .unwrap(); } pub fn get_version() -> &'static str { option_env!("UPEND_VERSION").unwrap_or("unknown") } pub trait UserDescribable { fn name(&self) -> &'static str; fn description(&self) -> Option<&'static str> { None } fn icon(&self) -> Option<&'static str> { None } fn full_description(&self) -> UserDescription { UserDescription { name: self.name(), description: self.description(), icon: self.icon(), } } } #[derive(Debug, Serialize)] pub struct UserDescription { pub name: &'static str, pub description: Option<&'static str>, pub icon: Option<&'static str>, }