use std::cell::RefCell;
use std::path::{Path, PathBuf};
#[derive(Clone)]
pub(crate) struct HomeOverride(Option<PathBuf>);
impl HomeOverride {
pub(crate) fn into_inner(self) -> Option<PathBuf> {
self.0
}
}
thread_local! {
static HOME_OVERRIDE: RefCell<Option<HomeOverride>> = const { RefCell::new(None) };
}
pub(crate) fn current_home_override() -> Option<HomeOverride> {
HOME_OVERRIDE.with(|c| c.borrow().clone())
}
pub(crate) fn with_home_override<R>(home: Option<&Path>, f: impl FnOnce() -> R) -> R {
struct Guard(Option<HomeOverride>);
impl Drop for Guard {
fn drop(&mut self) {
let prev = self.0.take();
HOME_OVERRIDE.with(|c| *c.borrow_mut() = prev);
}
}
let next = HomeOverride(home.map(Path::to_path_buf));
let prev = HOME_OVERRIDE.with(|c| c.replace(Some(next)));
let _g = Guard(prev);
f()
}