use super::resources_inner::ResourcesInner;
use std::sync::Arc;
#[derive(Debug, Default, Clone)]
pub struct ResourcesBuilder {
pub(crate) resources_inner: ResourcesInner,
}
impl ResourcesBuilder {
pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
self.resources_inner.get().cloned()
}
pub fn append<T: Clone + Send + Sync + 'static>(mut self, val: T) -> Self {
self.resources_inner.insert(val);
self
}
pub fn append_mut<T: Clone + Send + Sync + 'static>(&mut self, val: T) {
self.resources_inner.insert(val);
}
pub fn build(self) -> Resources {
Resources::from_base_inner(self.resources_inner)
}
}
#[derive(Debug, Clone, Default)]
pub struct Resources {
base_inner: Arc<ResourcesInner>,
overlay_inner: Arc<ResourcesInner>,
}
impl Resources {
pub fn builder() -> ResourcesBuilder {
ResourcesBuilder::default()
}
}
impl Resources {
pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
self.overlay_inner.get::<T>().or_else(|| self.base_inner.get::<T>()).cloned()
}
pub fn is_empty(&self) -> bool {
self.base_inner.is_empty() && self.overlay_inner.is_empty()
}
}
impl Resources {
pub(crate) fn from_base_inner(base_inner: ResourcesInner) -> Self {
Self {
base_inner: Arc::new(base_inner),
overlay_inner: Default::default(),
}
}
pub(crate) fn new_with_overlay(&self, overlay_resources: Resources) -> Self {
Self {
base_inner: self.base_inner.clone(),
overlay_inner: overlay_resources.base_inner.clone(),
}
}
}