use std::task::Waker;
use std::sync::atomic::{AtomicU16, AtomicU32};
use crate::QoS;
use crate::wrappers::{LmcHashMap, LmcMutex};
pub enum NotifyResult
{
WithoutWaker,
WithWaker(Waker),
Failed
}
pub type NotifierMap = LmcMutex<LmcHashMap<u16, NotifyResult>>;
pub enum SubscriptionState
{
Existing(QoS),
Pending(Vec<Option<Waker>>)
}
pub struct ClientShared
{
pub next_packet_id: AtomicU16,
pub notify_ack: NotifierMap,
pub notify_rec: NotifierMap,
pub notify_comp: NotifierMap,
pub subs: LmcMutex<LmcHashMap<String, SubscriptionState>>,
pub next_callback_id: AtomicU32
}
impl ClientShared
{
pub fn new() -> Self
{
Self {
next_packet_id: AtomicU16::new(1),
notify_ack: LmcMutex::new(Default::default()),
notify_rec: LmcMutex::new(Default::default()),
notify_comp: LmcMutex::new(Default::default()),
subs: LmcMutex::new(Default::default()),
next_callback_id: AtomicU32::new(0)
}
}
}