use crate::Hooks;
use core::{
any::Any,
cell::{Ref, RefMut},
};
mod private {
pub trait Sealed {}
impl Sealed for crate::Hooks<'_, '_> {}
}
pub trait UseContext<'a>: private::Sealed {
fn use_context<T: Any>(&self) -> Ref<'a, T>;
fn use_context_mut<T: Any>(&self) -> RefMut<'a, T>;
fn try_use_context<T: Any>(&self) -> Option<Ref<'a, T>>;
fn try_use_context_mut<T: Any>(&self) -> Option<RefMut<'a, T>>;
}
impl<'a> UseContext<'a> for Hooks<'a, '_> {
fn use_context<T: Any>(&self) -> Ref<'a, T> {
self.context_stack
.expect("context not available")
.get_context::<T>()
.expect("context not found")
}
fn use_context_mut<T: Any>(&self) -> RefMut<'a, T> {
self.context_stack
.expect("context not available")
.get_context_mut::<T>()
.expect("context not found")
}
fn try_use_context<T: Any>(&self) -> Option<Ref<'a, T>> {
self.context_stack
.and_then(|stack| stack.get_context::<T>())
}
fn try_use_context_mut<T: Any>(&self) -> Option<RefMut<'a, T>> {
self.context_stack
.and_then(|stack| stack.get_context_mut::<T>())
}
}