rillrate_protocol/base/list_flow/
tracer.rs1use super::state::*;
2use derive_more::{Deref, DerefMut};
3use rill_engine::tracers::tracer::{Tracer, Watcher};
4use rill_protocol::io::provider::Path;
5use std::collections::BTreeMap;
6
7pub type ListFlowWatcher<T> = Watcher<ListFlowState<T>>;
8
9#[derive(Debug, Deref, DerefMut, Clone)]
10pub struct ListFlowTracer<T: ListFlowSpec> {
11 tracer: Tracer<ListFlowState<T>>,
12}
13
14impl<T: ListFlowSpec> ListFlowTracer<T> {
15 pub fn new(path: Path) -> (Self, ListFlowWatcher<T>) {
16 let state = ListFlowState::new();
17 let (tracer, watcher) = Tracer::new_push(state, path);
18 (Self { tracer }, watcher)
19 }
20
21 pub fn add_record(&self, id: T::Id, record: T::Record) {
22 let update = ListFlowEvent::AddRecord { record };
23 let msg = ListEventEnvelope::SingleRecord { id, update };
24 self.tracer.send(msg, None);
25 }
26
27 pub fn update_record(&self, id: T::Id, update: impl Into<T::Update>) {
28 let update = update.into();
29 let update = ListFlowEvent::UpdateRecord { update };
30 let msg = ListEventEnvelope::SingleRecord { id, update };
31 self.tracer.send(msg, None);
32 }
33
34 pub fn remove_record(&self, id: T::Id) {
35 let update = ListFlowEvent::RemoveRecord;
36 let msg = ListEventEnvelope::SingleRecord { id, update };
37 self.tracer.send(msg, None);
38 }
39
40 pub fn full_snapshot(&self, records: BTreeMap<T::Id, T::Record>) {
41 let msg = ListEventEnvelope::FullSnapshot { records };
42 self.tracer.send(msg, None);
43 }
44
45 pub fn clear(&self) {
46 let msg = ListEventEnvelope::Clear;
47 self.tracer.send(msg, None);
48 }
49}