rpc_router/resource/
resources.rs1use super::resources_inner::ResourcesInner;
2use std::sync::Arc;
3
4#[derive(Debug, Default, Clone)]
7pub struct ResourcesBuilder {
8 pub(crate) resources_inner: ResourcesInner,
9}
10
11impl ResourcesBuilder {
12 pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
13 self.resources_inner.get().cloned()
14 }
15
16 pub fn append<T: Clone + Send + Sync + 'static>(mut self, val: T) -> Self {
17 self.resources_inner.insert(val);
18 self
19 }
20
21 pub fn append_mut<T: Clone + Send + Sync + 'static>(&mut self, val: T) {
24 self.resources_inner.insert(val);
25 }
26
27 pub fn build(self) -> Resources {
30 Resources::from_base_inner(self.resources_inner)
31 }
32}
33
34#[derive(Debug, Clone, Default)]
39pub struct Resources {
40 base_inner: Arc<ResourcesInner>,
41 overlay_inner: Arc<ResourcesInner>,
42}
43
44impl Resources {
46 pub fn builder() -> ResourcesBuilder {
49 ResourcesBuilder::default()
50 }
51}
52
53impl Resources {
55 pub fn get<T: Clone + Send + Sync + 'static>(&self) -> Option<T> {
56 self.overlay_inner.get::<T>().or_else(|| self.base_inner.get::<T>()).cloned()
58 }
59
60 pub fn is_empty(&self) -> bool {
61 self.base_inner.is_empty() && self.overlay_inner.is_empty()
62 }
63}
64
65impl Resources {
67 pub(crate) fn from_base_inner(base_inner: ResourcesInner) -> Self {
70 Self {
71 base_inner: Arc::new(base_inner),
72 overlay_inner: Default::default(),
73 }
74 }
75
76 pub(crate) fn new_with_overlay(&self, overlay_resources: Resources) -> Self {
77 Self {
78 base_inner: self.base_inner.clone(),
79 overlay_inner: overlay_resources.base_inner.clone(),
80 }
81 }
82}
83
84