use std::path::{Path, PathBuf};
pub fn get_app_cache() -> Option<PathBuf> {
std::env::var_os("XDG_CACHE_HOME")
.map(|v| v.into())
.or_else(|| std::env::var_os("HOME").map(|v| PathBuf::from(v).join(".cache")))
}
pub fn get_app_config() -> Option<PathBuf> {
std::env::var_os("XDG_CONFIG_HOME")
.map(|v| v.into())
.or_else(|| std::env::var_os("HOME").map(|v| PathBuf::from(v).join(".config")))
}
pub fn get_app_data() -> Option<PathBuf> {
std::env::var_os("XDG_DATA_HOME")
.map(|v| v.into())
.or_else(|| std::env::var_os("HOME").map(|v| PathBuf::from(v).join(".local/share")))
}
pub fn get_app_logs() -> Option<PathBuf> {
None }
pub fn get_app_documents() -> Option<PathBuf> {
None }
#[cfg(target_os = "freebsd")]
fn get_exe_path_freebsd() -> Option<PathBuf> {
use libc::size_t;
use libc::strlen;
use libc::sysctl;
use libc::CTL_KERN;
use libc::KERN_PROC;
use libc::KERN_PROC_PATHNAME;
use libc::PATH_MAX;
use std::ffi::OsStr;
use std::os::unix::ffi::OsStrExt;
let mut mib = [CTL_KERN, KERN_PROC, KERN_PROC_PATHNAME, -1];
let mut buf: Vec<u8> = Vec::with_capacity(PATH_MAX);
let mut cb: size_t = PATH_MAX;
unsafe {
let res = sysctl(
mib.as_mut_ptr(),
4,
buf.as_mut_ptr() as *mut _,
&mut cb as _,
std::ptr::null_mut(),
0,
);
if res == 0 {
let len = strlen(buf.as_ptr() as _);
let str = OsStr::from_bytes(&buf[..len]);
let path = PathBuf::from(str);
Some(path)
} else {
std::fs::read_link("/proc/curproc/file").ok()
}
}
}
fn get_exe_path() -> Option<PathBuf> {
cfg_if::cfg_if! {
if #[cfg(target_os = "freebsd")] {
get_exe_path_freebsd().parent().map(|v| v.into())
} else {
let mut path = Path::new("/proc/self/exe");
if !path.exists() {
path = Path::new("/proc/curproc/exe");
}
if !path.exists() {
path = Path::new("/proc/curproc/file");
}
let link = std::fs::read_link(path).ok()?;
link.parent().map(|v| v.into())
}
}
}
pub fn get_app_bundled_asset(file_name: &str) -> Option<PathBuf> {
let assets = get_exe_path()?.join("Assets");
let file = assets.join(file_name);
Some(file)
}
pub fn get_user_home() -> Option<PathBuf> {
std::env::var_os("HOME").map(|v| v.into())
}
pub fn get_user_documents() -> Option<PathBuf> {
std::env::var_os("XDG_DOCUMENTS_DIR")
.map(|v| v.into())
.or_else(|| std::env::var_os("HOME").map(|v| PathBuf::from(v).join("Documents")))
}
pub fn get_user_downloads() -> Option<PathBuf> {
std::env::var_os("XDG_DOWNLOAD_DIR")
.map(|v| v.into())
.or_else(|| std::env::var_os("HOME").map(|v| PathBuf::from(v).join("Downloads")))
}