rillrate_protocol/base/list_flow/
tracer.rs

1use 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}