capnweb_server/
cap_table.rs

1use crate::RpcTarget;
2use capnweb_core::CapId;
3use dashmap::DashMap;
4use std::sync::Arc;
5
6pub struct CapTable {
7    caps: DashMap<CapId, Arc<dyn RpcTarget>>,
8}
9
10impl CapTable {
11    pub fn new() -> Self {
12        CapTable {
13            caps: DashMap::new(),
14        }
15    }
16
17    pub fn insert(&self, id: CapId, target: Arc<dyn RpcTarget>) {
18        self.caps.insert(id, target);
19    }
20
21    pub fn lookup(&self, id: &CapId) -> Option<Arc<dyn RpcTarget>> {
22        self.caps.get(id).map(|entry| Arc::clone(&*entry))
23    }
24
25    pub fn remove(&self, id: &CapId) -> Option<Arc<dyn RpcTarget>> {
26        self.caps.remove(id).map(|(_, v)| v)
27    }
28
29    pub fn clear(&self) {
30        self.caps.clear();
31    }
32
33    pub fn len(&self) -> usize {
34        self.caps.len()
35    }
36
37    pub fn is_empty(&self) -> bool {
38        self.caps.is_empty()
39    }
40}
41
42impl Default for CapTable {
43    fn default() -> Self {
44        Self::new()
45    }
46}