use std::collections::HashMap;
#[cfg(any(feature = "postgres", feature = "sqlite"))]
pub mod sql;
#[derive(Clone, Debug, Default)]
pub struct MessageHeaders(HashMap<String, String>);
impl opentelemetry::propagation::Extractor for MessageHeaders {
fn get(&self, key: &str) -> Option<&str> {
self.0.get(key).map(String::as_str)
}
fn keys(&self) -> Vec<&str> {
self.0.keys().map(String::as_str).collect()
}
}
#[async_trait::async_trait]
pub trait MqClient: Send + Sync {
async fn new_consumer(
&self,
routing_key: &str,
worker_id: i32,
) -> anyhow::Result<Box<dyn MqConsumer>>;
async fn new_publisher(&self, routing_key: &str) -> anyhow::Result<Box<dyn MqPublisher>>;
async fn queue_depth(&self, _routing_key: &str) -> anyhow::Result<usize> {
Ok(0)
}
}
#[async_trait::async_trait]
pub trait MqPublisher: Send + Sync {
async fn publish(&self, payload: &[u8]) -> anyhow::Result<()>;
async fn ensure_consumer(&self) -> anyhow::Result<()>;
async fn has_consumer(&self) -> anyhow::Result<bool>;
}
#[async_trait::async_trait]
pub trait MqConsumer: Send + Sync {
async fn next(&mut self) -> Option<anyhow::Result<Box<dyn MqPayload>>>;
}
#[async_trait::async_trait]
pub trait MqPayload: Send + Sync {
async fn ack(&self) -> anyhow::Result<()>;
async fn nack_requeue(&self) -> anyhow::Result<()>;
async fn nack_discard(&self) -> anyhow::Result<()> {
self.ack().await
}
fn get_headers(&self) -> Option<MessageHeaders>;
fn data(&self) -> &[u8];
}