use super::Env;
use balls::layout::Xdg as BallsXdg;
use std::path::PathBuf;
impl Env {
pub fn balls_layout(&self) -> BallsXdg {
Self::layout_of(&self.home_dir(), &crate::world::marks::space(self))
}
pub fn balls_layout_for(&self, dir: &std::path::Path) -> BallsXdg {
Self::layout_of(&self.home_dir(), &crate::world::marks::space_for(self, dir))
}
fn layout_of(home: &std::path::Path, space: &crate::world::marks::Space) -> BallsXdg {
BallsXdg::with(
home,
Some(&space.config.to_string_lossy()),
Some(&space.state.to_string_lossy()),
)
}
pub(crate) fn host_state_home(&self) -> PathBuf {
match self.get(crate::world::HOST_STATE) {
Some(base) => PathBuf::from(base),
None => self.balls_state_home(),
}
}
pub(crate) fn host_config_home(&self) -> PathBuf {
match self.get("XDG_CONFIG_HOME") {
Some(base) => PathBuf::from(base),
None => self.home_dir().join(".config"),
}
}
pub(crate) fn balls_state_home(&self) -> PathBuf {
match self.get("XDG_STATE_HOME") {
Some(base) => PathBuf::from(base),
None => self.home_dir().join(".local/state"),
}
}
pub fn balls_state_root(&self) -> PathBuf {
self.balls_layout().state_dir()
}
pub fn balls_clones_dir(&self) -> PathBuf {
self.balls_layout().clones_dir()
}
pub fn balls_clone_roots(&self) -> Vec<PathBuf> {
let world = self.balls_clones_dir();
let host = crate::world::marks::Space::host(self).clones_dir(&self.home_dir());
if host == world {
vec![world]
} else {
vec![world, host]
}
}
pub fn balls_state_root_for(&self, dir: &std::path::Path) -> PathBuf {
self.balls_layout_for(dir).state_dir()
}
fn litany_home(&self) -> Option<PathBuf> {
self.get("LITANY_HOME").map(PathBuf::from)
}
pub fn litany_config_root(&self) -> PathBuf {
self.litany_home()
.unwrap_or_else(|| self.xdg("XDG_CONFIG_HOME", ".config", "litany"))
}
pub fn litany_data_root(&self) -> PathBuf {
self.litany_home()
.unwrap_or_else(|| self.xdg("XDG_DATA_HOME", ".local/share", "litany"))
}
}