use super::{RetainedMessage, Storage, StorageBackend};
use crate::error::Result;
use crate::packet::publish::PublishPacket;
use tracing::debug;
pub struct RetainedMessages<B: StorageBackend> {
storage: Storage<B>,
}
impl<B: StorageBackend + 'static> RetainedMessages<B> {
#[must_use]
pub fn new(storage: Storage<B>) -> Self {
Self { storage }
}
pub async fn store(&self, topic: &str, packet: PublishPacket) -> Result<()> {
if packet.payload.is_empty() {
debug!("Removing retained message for topic: {}", topic);
self.storage.remove_retained(topic).await
} else {
let message = RetainedMessage::new(packet);
debug!("Storing retained message for topic: {}", topic);
self.storage.store_retained(topic, message).await
}
}
pub async fn get(&self, topic: &str) -> Option<RetainedMessage> {
self.storage.get_retained(topic).await
}
pub async fn get_matching(&self, topic_filter: &str) -> Vec<(String, RetainedMessage)> {
self.storage.get_retained_matching(topic_filter).await
}
pub async fn remove(&self, topic: &str) -> Result<()> {
self.storage.remove_retained(topic).await
}
}