use std::{borrow::Cow, collections::HashSet};
use serde::{Deserialize, Serialize};
use super::{subscription::SubscriptionOptions, topic::PublishProperties, Type};
#[derive(Debug, Serialize, Deserialize)]
#[serde(tag = "method", content = "params", rename_all = "lowercase")]
pub(crate) enum NTMessage<'a> {
#[serde(borrow = "'a")]
Publish(PublishTopic<'a>),
Unpublish(UnpublishTopic),
Subscribe(Subscribe),
Unsubscribe(Unsubscribe),
SetProperties(SetProperties<'a>),
#[serde(borrow = "'a")]
Announce(Announce<'a>),
#[serde(borrow = "'a")]
UnAnnounce(UnAnnounce<'a>),
#[serde(borrow = "'a")]
Properties(Properties<'a>),
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct PublishTopic<'a> {
pub(crate) name: &'a str,
pub(crate) pubuid: u32,
pub(crate) r#type: Type,
#[serde(borrow = "'a", skip_serializing_if = "Option::is_none")]
pub(crate) properties: Cow<'a, Option<PublishProperties>>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct UnpublishTopic {
pub(crate) pubuid: u32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct Subscribe {
pub(crate) subuid: i32,
pub(crate) topics: HashSet<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub(crate) options: Option<SubscriptionOptions>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct Unsubscribe {
pub(crate) subuid: i32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct SetProperties<'a> {
pub(crate) name: &'a str,
pub(crate) update: Cow<'a, PublishProperties>,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct Announce<'a> {
pub(crate) name: &'a str,
pub(crate) id: i32,
pub(crate) r#type: Type,
pub(crate) pubuid: Option<i32>,
pub(crate) properties: PublishProperties,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct UnAnnounce<'a> {
pub(crate) name: &'a str,
pub(crate) id: i32,
}
#[derive(Debug, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub struct Properties<'a> {
pub(crate) name: &'a str,
pub(crate) ack: Option<bool>,
}