use std::sync::Arc;
use async_trait::async_trait;
use serde::{Deserialize, Serialize};
use crate::{Error, Message};
pub mod memory;
pub mod disk;
pub mod redis;
#[async_trait]
pub trait Buffer: Send + Sync {
async fn push(&self, msg: &Message) -> Result<(), Error>;
async fn pop(&self) -> Result<Option<Message>, Error>;
async fn close(&self) -> Result<(), Error>;
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(tag = "type", rename_all = "lowercase")]
pub enum BufferConfig {
Memory(memory::MemoryBufferConfig),
Disk(disk::DiskBufferConfig),
Redis(redis::RedisBufferConfig),
}
impl BufferConfig {
pub fn build(&self) -> Result<Arc<dyn Buffer>, Error> {
match self {
BufferConfig::Memory(config) => Ok(Arc::new(memory::MemoryBuffer::new(config)?)),
BufferConfig::Disk(config) => Ok(Arc::new(disk::DiskBuffer::new(config)?)),
BufferConfig::Redis(config) => Ok(Arc::new(redis::RedisBuffer::new(config)?)),
}
}
}