1use super::language;
12use super::skeleton;
13use super::actor::*;
14use super::schemas::dataspace::*;
15
16use preserves::value::Map;
17use preserves_schema::Codec;
18
19#[derive(Debug)]
21pub struct Dataspace {
22 pub name: Name,
23 pub index: skeleton::Index,
26 pub handle_map: Map<Handle, _Any>,
29}
30
31impl Dataspace {
32 pub fn new(name: Name) -> Self {
34 Self {
35 name,
36 index: skeleton::Index::new(),
37 handle_map: Map::new(),
38 }
39 }
40
41 pub fn assertion_count(&self) -> usize {
44 self.index.assertion_count()
45 }
46
47 pub fn endpoint_count(&self) -> isize {
50 self.index.endpoint_count()
51 }
52
53 pub fn observer_count(&self) -> usize {
55 self.index.observer_count()
56 }
57}
58
59impl Entity<_Any> for Dataspace {
60 fn assert(&mut self, t: &mut Activation, a: _Any, h: Handle) -> ActorResult {
61 let is_new = self.index.insert(t, &a);
62 tracing::trace!(dataspace = ?self.name, assertion = ?a, handle = ?h, ?is_new, "assert");
63
64 if is_new {
65 if let Ok(o) = language().parse::<Observe>(&a) {
66 self.index.add_observer(t, &o.pattern, &o.observer);
67 }
68 }
69
70 self.handle_map.insert(h, a);
71 Ok(())
72 }
73
74 fn retract(&mut self, t: &mut Activation, h: Handle) -> ActorResult {
75 match self.handle_map.remove(&h) {
76 None => tracing::warn!(dataspace = ?self.name, handle = ?h, "retract of unknown handle"),
77 Some(a) => {
78 let is_last = self.index.remove(t, &a);
79 tracing::trace!(dataspace = ?self.name, assertion = ?a, handle = ?h, ?is_last, "retract");
80
81 if is_last {
82 if let Ok(o) = language().parse::<Observe>(&a) {
83 self.index.remove_observer(t, o.pattern, &o.observer);
84 }
85 }
86 }
87 }
88 Ok(())
89 }
90
91 fn message(&mut self, t: &mut Activation, m: _Any) -> ActorResult {
92 tracing::trace!(dataspace = ?self.name, body = ?m, "message");
93 self.index.send(t, &m);
94 Ok(())
95 }
96}