use super::error::TransportResult;
use super::filter::FilteredDlqEntry;
use super::types::{Message, SendResult};
use std::fmt::{Debug, Display};
use std::future::Future;
pub trait CommitToken: Clone + Send + Sync + Debug + Display + 'static {
fn as_str(&self) -> String {
format!("{self}")
}
}
pub trait TransportBase: Send + Sync {
fn close(&self) -> impl Future<Output = TransportResult<()>> + Send;
fn is_healthy(&self) -> bool;
fn name(&self) -> &'static str;
}
pub trait TransportSender: TransportBase {
fn send(&self, key: &str, payload: &[u8]) -> impl Future<Output = SendResult> + Send;
}
pub trait TransportReceiver: TransportBase {
type Token: CommitToken;
fn recv(
&self,
max: usize,
) -> impl Future<Output = TransportResult<Vec<Message<Self::Token>>>> + Send;
fn commit(&self, tokens: &[Self::Token]) -> impl Future<Output = TransportResult<()>> + Send;
fn take_filtered_dlq_entries(&self) -> Vec<FilteredDlqEntry> {
Vec::new()
}
}
pub trait Transport: TransportSender + TransportReceiver {}
impl<T: TransportSender + TransportReceiver> Transport for T {}