use std::marker::PhantomData;
use crate::error::ContextError;
use crate::registry::RegistryBuilder;
pub struct ContextKey<T: 'static> {
key: &'static str,
_marker: PhantomData<fn() -> T>,
}
impl<T> ContextKey<T>
where
T: Clone + Default + Send + Sync + serde::Serialize + serde::de::DeserializeOwned + 'static,
{
pub const fn new(key: &'static str) -> Self {
Self {
key,
_marker: PhantomData,
}
}
pub fn register_on(&self, builder: &mut RegistryBuilder) {
builder.register::<T>(self.key);
}
pub fn try_register_on(&self, builder: &mut RegistryBuilder) -> Result<(), ContextError> {
builder.try_register::<T>(self.key)
}
pub fn get(&self) -> Option<T> {
crate::get_context_variable::<T>(self.key)
}
pub fn set(&self, value: T) {
crate::set_context_variable::<T>(self.key, value);
}
pub fn key(&self) -> &'static str {
self.key
}
}