use crate::{
core::event_engine::EffectInvocation,
dx::subscribe::{
event_engine::{SubscribeEffect, SubscribeEvent, SubscriptionInput},
result::Update,
ConnectionStatus, SubscriptionCursor,
},
lib::{
alloc::vec::Vec,
core::fmt::{Display, Formatter, Result},
},
};
#[derive(Debug)]
pub(crate) enum SubscribeEffectInvocation {
Handshake {
input: SubscriptionInput,
cursor: Option<SubscriptionCursor>,
},
CancelHandshake,
Receive {
input: SubscriptionInput,
cursor: SubscriptionCursor,
},
CancelReceive,
EmitStatus(ConnectionStatus),
EmitMessages(Vec<Update>, SubscriptionCursor),
TerminateEventEngine,
}
impl EffectInvocation for SubscribeEffectInvocation {
type Effect = SubscribeEffect;
type Event = SubscribeEvent;
fn id(&self) -> &str {
match self {
Self::Handshake { .. } => "HANDSHAKE",
Self::CancelHandshake { .. } => "CANCEL_HANDSHAKE",
Self::Receive { .. } => "RECEIVE_MESSAGES",
Self::CancelReceive { .. } => "CANCEL_RECEIVE_MESSAGES",
Self::EmitStatus(_) => "EMIT_STATUS",
Self::EmitMessages(_, _) => "EMIT_MESSAGES",
Self::TerminateEventEngine => "TERMINATE_EVENT_ENGINE",
}
}
fn is_managed(&self) -> bool {
matches!(self, Self::Handshake { .. } | Self::Receive { .. })
}
fn is_cancelling(&self) -> bool {
matches!(
self,
Self::CancelHandshake { .. } | Self::CancelReceive { .. }
)
}
fn cancelling_effect(&self, effect: &Self::Effect) -> bool {
(matches!(effect, SubscribeEffect::Handshake { .. })
&& matches!(self, Self::CancelHandshake { .. }))
|| (matches!(effect, SubscribeEffect::Receive { .. })
&& matches!(self, Self::CancelReceive { .. }))
}
fn is_terminating(&self) -> bool {
matches!(self, Self::TerminateEventEngine)
}
}
impl Display for SubscribeEffectInvocation {
fn fmt(&self, f: &mut Formatter<'_>) -> Result {
match self {
Self::Handshake { .. } => write!(f, "HANDSHAKE"),
Self::CancelHandshake => write!(f, "CANCEL_HANDSHAKE"),
Self::Receive { .. } => write!(f, "RECEIVE_MESSAGES"),
Self::CancelReceive { .. } => write!(f, "CANCEL_RECEIVE_MESSAGES"),
Self::EmitStatus(status) => write!(f, "EMIT_STATUS({status:?})"),
Self::EmitMessages(messages, _) => write!(f, "EMIT_MESSAGES({messages:?})"),
Self::TerminateEventEngine => write!(f, "TERMINATE_EVENT_ENGINE"),
}
}
}