use super::extensions::Extensions;
use std::sync::Arc;
#[derive(Default)]
pub struct RpcResourcesBuilder {
type_map: Extensions,
}
impl RpcResourcesBuilder {
pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
self.type_map.get().cloned()
}
pub fn insert<T: Clone + Send + Sync + 'static>(mut self, val: T) -> Self {
self.type_map.insert(val);
self
}
pub fn build(self) -> RpcResources {
self.build_shared()
}
pub fn build_shared(self) -> RpcResources {
RpcResources::new_shared(self.type_map)
}
pub fn build_owned(self) -> RpcResources {
RpcResources::new_owned(self.type_map)
}
}
#[derive(Clone)]
pub struct RpcResources {
type_map_holder: TypeMapHolder,
}
impl RpcResources {
pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
let type_map = self.type_map_holder.get();
type_map.get().cloned()
}
}
impl RpcResources {
fn new_shared(type_map: Extensions) -> Self {
Self {
type_map_holder: TypeMapHolder::Shared(Arc::new(type_map)),
}
}
fn new_owned(type_map: Extensions) -> Self {
Self {
type_map_holder: TypeMapHolder::Owned(type_map),
}
}
}
#[derive(Clone)]
enum TypeMapHolder {
Shared(Arc<Extensions>),
Owned(Extensions),
}
impl TypeMapHolder {
fn get(&self) -> &Extensions {
match self {
Self::Shared(extensions) => extensions.as_ref(),
Self::Owned(extensions) => extensions,
}
}
}