use alloc::vec::Vec;
use mqtt_proto::{Pid, QoS, TopicFilter, TopicName};
use crate::error::MqttError;
use crate::state::SubscriptionInfo;
mod in_memory;
pub use in_memory::InMemorySession;
#[derive(Debug, Clone)]
pub struct InflightMessage {
pub topic: TopicName,
pub qos: QoS,
pub retain: bool,
pub payload: Vec<u8>,
pub retry_count: u8,
pub timestamp: u64,
}
#[allow(async_fn_in_trait)]
pub trait SessionState {
fn next_pid(&mut self) -> Pid;
fn store_outgoing_publish(
&mut self,
pid: Pid,
message: InflightMessage,
) -> Result<(), MqttError>;
fn get_outgoing_publish_mut(&mut self, pid: Pid) -> Option<&mut InflightMessage>;
fn complete_outgoing_publish(&mut self, pid: Pid) -> Option<InflightMessage>;
fn pending_outgoing_publishes(&self) -> impl Iterator<Item = (Pid, &InflightMessage)>;
fn store_outgoing_pubrel(&mut self, pid: Pid) -> Result<(), MqttError>;
fn complete_outgoing_pubrel(&mut self, pid: Pid) -> Option<Pid>;
fn pending_outgoing_pubrels(&self) -> impl Iterator<Item = &Pid>;
fn add_subscription(
&mut self,
pid: Pid,
topic_filter: TopicFilter,
qos: QoS,
) -> Result<(), MqttError>;
fn confirm_subscription(&mut self, pid: Pid, return_codes: &[u8]) -> Result<(), MqttError>;
fn remove_subscription(&mut self, pid: Pid) -> Option<SubscriptionInfo>;
fn clear(&mut self);
}