use crate::mqtt::common::HashMap;
use alloc::string::String;
use alloc::string::ToString;
use crate::mqtt::common::tracing::trace;
pub type TopicAliasType = u16;
pub struct TopicAliasRecv {
max_alias: TopicAliasType,
aliases: HashMap<TopicAliasType, String>,
}
impl TopicAliasRecv {
const MIN_ALIAS: TopicAliasType = 1;
pub fn new(max_alias: TopicAliasType) -> Self {
trace!("Creating TopicAliasRecv with max_alias: {}", max_alias);
Self {
max_alias,
aliases: HashMap::default(),
}
}
pub fn insert_or_update(&mut self, topic: &str, alias: TopicAliasType) {
trace!("TopicAliasRecv insert topic: '{}', alias: {}", topic, alias);
assert!(!topic.is_empty() && alias >= Self::MIN_ALIAS && alias <= self.max_alias);
self.aliases.insert(alias, topic.to_string());
}
pub fn get(&self, alias: TopicAliasType) -> Option<&str> {
trace!("Getting topic by alias: {}", alias);
if alias >= Self::MIN_ALIAS && alias <= self.max_alias {
self.aliases.get(&alias).map(|s| s.as_str())
} else {
None
}
}
pub fn peek(&self, alias: TopicAliasType) -> Option<&str> {
self.get(alias)
}
pub fn clear(&mut self) {
trace!("Clearing all topic aliases");
self.aliases.clear();
}
pub fn max(&self) -> TopicAliasType {
self.max_alias
}
}