use ruststream::asyncapi::{Binding, Bindings};
use serde::Serialize;
use crate::filter::Qos;
pub(crate) const PROTOCOL: &str = "mqtt";
const VERSION: &str = "0.2.0";
fn one<T: Serialize>(body: &T) -> Bindings {
Binding::new(PROTOCOL, VERSION, body)
.map_or_else(|_| Bindings::new(), |b| Bindings::new().with(b))
}
#[derive(Debug, Serialize)]
pub(crate) struct MqttServer {
#[serde(rename = "clientId")]
pub(crate) client_id: String,
#[serde(rename = "cleanSession", skip_serializing_if = "Option::is_none")]
pub(crate) clean_session: Option<bool>,
#[serde(rename = "lastWill", skip_serializing_if = "Option::is_none")]
pub(crate) last_will: Option<MqttLastWill>,
#[serde(rename = "keepAlive", skip_serializing_if = "Option::is_none")]
pub(crate) keep_alive: Option<u64>,
#[serde(
rename = "sessionExpiryInterval",
skip_serializing_if = "Option::is_none"
)]
pub(crate) session_expiry_interval: Option<u32>,
#[serde(rename = "maximumPacketSize")]
pub(crate) maximum_packet_size: u32,
}
#[derive(Debug, Serialize)]
pub(crate) struct MqttLastWill {
pub(crate) topic: String,
pub(crate) qos: u8,
pub(crate) retain: bool,
}
#[derive(Debug, Serialize)]
struct MqttOperation {
qos: u8,
#[serde(skip_serializing_if = "Option::is_none")]
retain: Option<bool>,
}
#[derive(Debug, Serialize)]
struct MqttMessageBinding {
#[serde(rename = "correlationData")]
correlation_data: StringSchema,
#[serde(rename = "responseTopic", skip_serializing_if = "Option::is_none")]
response_topic: Option<StringSchema>,
}
#[derive(Debug, Serialize)]
struct StringSchema {
#[serde(rename = "type")]
kind: &'static str,
description: &'static str,
}
pub(crate) fn server(server: &MqttServer) -> Bindings {
one(server)
}
pub(crate) fn receive_operation(qos: Qos) -> Bindings {
one(&MqttOperation {
qos: qos.level(),
retain: None,
})
}
pub(crate) fn send_operation(qos: Qos, retain: bool) -> Bindings {
one(&MqttOperation {
qos: qos.level(),
retain: Some(retain),
})
}
pub(crate) fn message() -> Bindings {
mapped_properties(Some(StringSchema {
kind: "string",
description: "The reply-to header, carried in the MQTT 5 Response Topic property.",
}))
}
pub(crate) fn publish_message() -> Bindings {
mapped_properties(None)
}
fn mapped_properties(response_topic: Option<StringSchema>) -> Bindings {
one(&MqttMessageBinding {
correlation_data: StringSchema {
kind: "string",
description: "The correlation-id header, carried in the MQTT 5 Correlation Data \
property.",
},
response_topic,
})
}
pub(crate) const REPLY_ADDRESS_LOCATION: &str = "$message.header#/reply-to";