use tracing::debug;
use crate::*;
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubscriptionUpdate {
Skip,
Read,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SubscriptionErrorAction {
Continue,
Stop,
}
pub trait SubscriptionDef<
B: BlockDef + Send + 'static,
BR: BlockReferredDef<B> + 'static,
P: PayloadDef<Inner> + Send + 'static,
Inner: PayloadInnerDef + Send + 'static,
O: Send + Sync + 'static,
>: Send
{
fn on_update(&mut self, total: usize, added: usize) -> SubscriptionUpdate;
#[allow(unused)]
fn on_packet(&mut self, packet: PacketDef<B, P, Inner>) {
let _ = packet;
}
fn on_error(&mut self, err: &Error) -> SubscriptionErrorAction {
debug!("Error on reading data with observer: {err}");
SubscriptionErrorAction::Continue
}
fn on_stopped(&mut self, reason: Option<Error>) {
let _ = reason;
}
fn on_aborted(&mut self) {
}
}
#[cfg(test)]
mod tests {
use super::{SubscriptionDef, SubscriptionErrorAction, SubscriptionUpdate};
use crate::{
DefaultPayloadContext, Error, PacketDef,
tests::{TestBlock, TestPayload},
};
struct TestSubscription {
updates: usize,
}
impl SubscriptionDef<TestBlock, TestBlock, TestPayload, TestPayload, DefaultPayloadContext>
for TestSubscription
{
fn on_update(&mut self, _total: usize, _added: usize) -> SubscriptionUpdate {
self.updates += 1;
SubscriptionUpdate::Read
}
}
#[test]
fn default_subscription_methods_are_safe_and_continue_on_error() {
let mut sub = TestSubscription { updates: 0 };
assert!(matches!(sub.on_update(10, 2), SubscriptionUpdate::Read));
assert_eq!(sub.updates, 1);
let packet = PacketDef::<TestBlock, TestPayload, TestPayload>::default();
sub.on_packet(packet);
let action = sub.on_error(&Error::Test);
assert_eq!(action, SubscriptionErrorAction::Continue);
sub.on_stopped(None);
sub.on_stopped(Some(Error::Test));
sub.on_aborted();
}
}