use std::{any::Any, cell::RefCell};
thread_local! {
static CONTEXT: RefCell<Option<Box<dyn Any + Send>>> = RefCell::new(None);
}
pub(crate) fn set<C: Send + 'static>(context: C) {
CONTEXT.with(|cell| {
*cell.borrow_mut() = Some(Box::new(context));
});
}
pub fn get<C: Send + 'static>() -> C {
CONTEXT.with(|cell| {
let mut borrow = cell.borrow_mut();
match borrow.take() {
Some(context) => {
let context = context.downcast::<C>().expect("failed to downcast context");
*context
}
None => panic!("no context set"),
}
})
}
pub(crate) fn clear() {
CONTEXT.with(|cell| {
*cell.borrow_mut() = None;
});
}