drogue_client/registry/v1/data/common/
mqtt.rs1use crate::{dialect, serde::is_default, Section};
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
5#[serde(rename_all = "camelCase")]
6pub struct MqttSpec {
7 #[serde(default, skip_serializing_if = "is_default")]
8 pub dialect: MqttDialect,
9}
10
11dialect!(MqttSpec [Section::Spec => "mqtt"]);
12
13#[derive(Clone, Debug, PartialEq, Eq, Serialize, Deserialize)]
14#[serde(rename_all = "camelCase")]
15#[serde(tag = "type")]
16pub enum MqttDialect {
17 #[serde(rename = "drogue/v1")]
18 DrogueV1,
19 #[serde(rename_all = "camelCase")]
20 PlainTopic {
21 #[serde(default, skip_serializing_if = "is_default")]
22 device_prefix: bool,
23 },
24}
25
26impl Default for MqttDialect {
27 fn default() -> Self {
28 Self::DrogueV1
29 }
30}
31
32#[cfg(test)]
33mod test {
34 use serde_json::json;
35
36 use super::*;
37
38 #[test]
39 fn test_default() {
40 assert_eq!(
41 MqttSpec {
42 dialect: MqttDialect::DrogueV1
43 },
44 serde_json::from_value(json!({})).unwrap()
45 )
46 }
47
48 #[test]
49 fn test_explicit_v1() {
50 assert_eq!(
51 MqttSpec {
52 dialect: MqttDialect::DrogueV1
53 },
54 serde_json::from_value(json!({
55 "dialect": {
56 "type": "drogue/v1",
57 }
58 }))
59 .unwrap()
60 )
61 }
62
63 #[test]
64 fn test_plain_default() {
65 assert_eq!(
66 MqttSpec {
67 dialect: MqttDialect::PlainTopic {
68 device_prefix: false
69 }
70 },
71 serde_json::from_value(json!({
72 "dialect":{
73 "type": "plainTopic",
74 }
75 }))
76 .unwrap()
77 )
78 }
79
80 #[test]
81 fn test_plain_true() {
82 assert_eq!(
83 MqttSpec {
84 dialect: MqttDialect::PlainTopic {
85 device_prefix: true
86 }
87 },
88 serde_json::from_value(json!({
89 "dialect":{
90 "type": "plainTopic",
91 "devicePrefix": true,
92 }
93 }))
94 .unwrap()
95 )
96 }
97}