pipecircuit 0.0.22

Correct. Robust. Fast. Portable. Pick four.
Documentation
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),
        })
    }
}