use super::server::{LockBound, ServerCompositor};
use std::any::Any;
use std::rc::Rc;
pub struct RenderInterfaceFeature {
feature: LockBound<Rc<dyn Any>>,
}
impl RenderInterfaceFeature {
pub(crate) fn new(feature: LockBound<Rc<dyn Any>>) -> Self {
Self { feature }
}
fn lend<T: ?Sized + 'static>(feature: &Rc<dyn Any>) -> Option<&T> {
feature.downcast_ref::<Rc<T>>().map(|feature| &**feature)
}
pub fn with<T: ?Sized + 'static, R>(&self, f: impl FnOnce(&T) -> R) -> Option<R> {
self.feature.with(|_, feature| Self::lend::<T>(feature).map(f)).flatten()
}
pub fn get<'a, T: ?Sized + 'static>(&'a self, server: &'a ServerCompositor) -> Option<&'a T> {
Self::lend::<T>(self.feature.get(server))
}
pub fn is<T: 'static>(&self) -> bool {
self.feature.with(|_, feature| feature.is::<T>()).unwrap_or(false)
}
}
const _: fn() = || {
fn assert_send_sync<T: Send + Sync>() {}
assert_send_sync::<RenderInterfaceFeature>();
};