use super::*;
use crate::storage::warp_table::observed::AppliedViewChange;
#[must_use]
#[derive(Debug, PartialEq, Eq)]
pub enum SubscriptionChanges<'report, Id> {
Applied {
changes: &'report [AppliedViewChange<Id>],
},
Subscribed,
Resynchronizing,
Stale,
BaselineRequired,
Refused(SubscriptionRefusal),
}
pub struct ReceiveSubscriptionChanges<'message, 'report, Value, Outcome, Refusal, Id, Projection> {
receive: ReceiveSubscription<'message, Value, Outcome, Refusal, Id, Projection>,
report: &'report mut AppliedViewChanges<Id>,
}
impl<'message, Value, Outcome, Refusal, Id, Projection>
ReceiveSubscription<'message, Value, Outcome, Refusal, Id, Projection>
{
pub fn with_changes<'report>(
self,
report: &'report mut AppliedViewChanges<Id>,
) -> ReceiveSubscriptionChanges<'message, 'report, Value, Outcome, Refusal, Id, Projection>
{
ReceiveSubscriptionChanges {
receive: self,
report,
}
}
}
impl<'report, Value, Outcome, Refusal, Id: IndexKey, Projection: Clone + Eq>
StepInputOf<SubscribedView<Id, Projection>>
for ReceiveSubscriptionChanges<'_, 'report, Value, Outcome, Refusal, Id, Projection>
{
type Outcome = Result<SubscriptionChanges<'report, Id>, SubscriptionReceiveError>;
fn step(self, subscriber: &mut SubscribedView<Id, Projection>) -> Self::Outcome {
self.report.clear();
Ok(match self.receive.receive(subscriber, Some(self.report))? {
SubscriptionProgress::Updated(ViewApplyOutcome::Applied) => {
SubscriptionChanges::Applied {
changes: self.report.as_slice(),
}
}
SubscriptionProgress::Updated(ViewApplyOutcome::Stale) => SubscriptionChanges::Stale,
SubscriptionProgress::Updated(ViewApplyOutcome::BaselineRequired) => {
SubscriptionChanges::BaselineRequired
}
SubscriptionProgress::Subscribed => SubscriptionChanges::Subscribed,
SubscriptionProgress::Resynchronizing => SubscriptionChanges::Resynchronizing,
SubscriptionProgress::Refused(reason) => SubscriptionChanges::Refused(reason),
})
}
}