use std::sync::Arc;
use tokio::sync::mpsc;
use crate::QoS;
use super::packets::IncomingPublishPacket;
use super::util::def_enum_with_intos;
pub struct FastCallback
{
pub id: u32,
pub f: Box<dyn FnMut(IncomingPublishPacket) + Send + Sync>
}
pub enum SubscriptionKind
{
Void,
Lossy(mpsc::Sender<IncomingPublishPacket>),
Unbounded(mpsc::UnboundedSender<IncomingPublishPacket>),
FastCallback(FastCallback)
}
pub struct PublishCommand
{
pub packet_id: u16,
pub qos: QoS,
pub packet: Arc<[u8]>
}
pub struct SubscribeCommand
{
pub topic: String,
pub qos: QoS,
pub kind: SubscriptionKind
}
pub enum UnsubKind
{
FastCallback(u32),
Immediate
}
pub struct UnsubCommand
{
pub topic: String,
pub kind: UnsubKind
}
def_enum_with_intos! {
pub enum Command
{
Publish(PublishCommand),
Subscribe(SubscribeCommand),
Unsub(UnsubCommand),
Disconnect
}
}