use std::fmt::Debug;
use anyhow::Result;
use async_trait::async_trait;
use futures::Stream;
use crate::{acker::Acker, serializer::Serializable};
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum DeliveryMode {
#[default]
Persistent,
Ephemeral,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum SyndicationMode {
#[default]
ExactlyOnce,
Broadcast,
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
pub enum QueueDurability {
#[default]
NonDurable,
Durable,
}
#[derive(Clone, Copy, Debug, Default)]
pub struct QueueOptions {
pub delivery_mode: DeliveryMode,
pub syndication_mode: SyndicationMode,
pub durability: QueueDurability,
}
#[async_trait]
pub trait Connection: Clone {
type QueueHandle: QueueHandle;
async fn close(&self) -> Result<()>;
async fn declare_queue(&self, name: &str, options: QueueOptions) -> Result<Self::QueueHandle>;
async fn delete_queue(&self, name: &str) -> Result<()>;
}
#[async_trait]
pub trait QueueHandle: Clone {
type Acker: Acker;
type Consumer<T: Serializable>: Stream<Item = (T, Self::Acker)>;
type Publisher<T: Serializable>: Publisher<T>;
fn publisher<PayloadTarget: Serializable>(&self) -> Self::Publisher<PayloadTarget>;
async fn publish<PayloadTarget: Serializable>(&self, payload: &PayloadTarget) -> Result<()>
where
Self::Publisher<PayloadTarget>: Send,
{
self.publisher().publish(payload).await
}
async fn declare_consumer<PayloadTarget: Serializable>(
&self,
consumer_name: &str,
) -> Result<Self::Consumer<PayloadTarget>>;
}
pub mod amqp;
pub mod in_memory;
mod publisher;
pub use publisher::*;