rillrate-protocol 0.36.0

Top level protocol for the RillRate protocol.
Documentation
use super::state::*;
use derive_more::{Deref, DerefMut};
use rill_engine::tracers::tracer::{Tracer, Watcher};
use rill_protocol::io::provider::Path;
use std::collections::BTreeMap;

pub type ListFlowWatcher<T> = Watcher<ListFlowState<T>>;

#[derive(Debug, Deref, DerefMut, Clone)]
pub struct ListFlowTracer<T: ListFlowSpec> {
    tracer: Tracer<ListFlowState<T>>,
}

impl<T: ListFlowSpec> ListFlowTracer<T> {
    pub fn new(path: Path) -> (Self, ListFlowWatcher<T>) {
        let state = ListFlowState::new();
        let (tracer, watcher) = Tracer::new_push(state, path);
        (Self { tracer }, watcher)
    }

    pub fn add_record(&self, id: T::Id, record: T::Record) {
        let update = ListFlowEvent::AddRecord { record };
        let msg = ListEventEnvelope::SingleRecord { id, update };
        self.tracer.send(msg, None);
    }

    pub fn update_record(&self, id: T::Id, update: impl Into<T::Update>) {
        let update = update.into();
        let update = ListFlowEvent::UpdateRecord { update };
        let msg = ListEventEnvelope::SingleRecord { id, update };
        self.tracer.send(msg, None);
    }

    pub fn remove_record(&self, id: T::Id) {
        let update = ListFlowEvent::RemoveRecord;
        let msg = ListEventEnvelope::SingleRecord { id, update };
        self.tracer.send(msg, None);
    }

    pub fn full_snapshot(&self, records: BTreeMap<T::Id, T::Record>) {
        let msg = ListEventEnvelope::FullSnapshot { records };
        self.tracer.send(msg, None);
    }

    pub fn clear(&self) {
        let msg = ListEventEnvelope::Clear;
        self.tracer.send(msg, None);
    }
}