wamp_core/messages/unregistered.rs
1use super::{helpers, MessageDirection, WampMessage};
2use crate::roles::Roles;
3use serde::de::{SeqAccess, Visitor};
4use serde::{Deserialize, Deserializer, Serialize};
5use std::fmt::Formatter;
6use std::marker::PhantomData;
7
8#[derive(Debug, Clone, PartialEq, Eq)]
9/// # Unregistered - [wamp-proto](https://wamp-proto.org/wamp_latest_ietf.html#name-subscribed-2)
10/// Represents an Unregistered message in the WAMP protocol.
11/// ## Examples
12/// ```
13/// use wamp_core::messages::Unregistered;
14/// use wamp_core::unregistered;
15///
16/// # let unregistered_message1 = unregistered!(1);
17///
18/// let unregistered_message = Unregistered {
19/// request_id: 1
20/// };
21///
22/// # assert_eq!(unregistered_message, unregistered_message1);
23/// ```
24/// ### Serializer
25/// Implements serde Serialize trait for Unregistered
26/// ```
27/// use wamp_core::messages::Unregistered;
28/// use serde_json::{json, to_string};
29///
30/// // Create an Unregistered message
31/// let unregistered = Unregistered {
32/// request_id: 1
33/// };
34///
35/// // Establish raw json data string
36/// let data = r#"[67,1]"#;
37///
38/// // Here we convert it from an `Unregistered` frame, to a string representation.
39/// let unregistered = to_string(&unregistered).unwrap();
40///
41/// // Confirm that our Unregistered frame strings are equal to each other
42/// assert_eq!(unregistered, data);
43/// ```
44/// ### Deserializer
45/// Implements serde Deserialize trait for Unregistered
46/// ```
47/// use wamp_core::messages::Unregistered;
48/// use serde_json::from_str;
49///
50/// // Here is our raw json data string
51/// let data = r#"[67,1]"#;
52///
53/// // Here we convert it to an `Unregistered` frame
54/// let unregistered = from_str::<Unregistered>(data).unwrap();
55///
56/// // Confirm that our request_id deserialized
57/// assert_eq!(unregistered.request_id, 1);
58/// ```
59pub struct Unregistered {
60 pub request_id: u64,
61}
62
63#[macro_export]
64/// # Unregistered Macro - [wamp-proto](https://wamp-proto.org/wamp_latest_ietf.html#name-subscribed-2)
65/// Quicly create unregistered message with this macro.
66/// ## Examples
67/// ```
68/// use wamp_core::messages::Unregistered;
69/// use wamp_core::unregistered;
70///
71/// # let unregistered_message1 = unregistered!(1);
72///
73/// let unregistered_message = Unregistered {
74/// request_id: 1
75/// };
76///
77/// # assert_eq!(unregistered_message, unregistered_message1);
78/// ```
79macro_rules! unregistered {
80 ($request_id:expr) => {
81 Unregistered {
82 request_id: $request_id,
83 }
84 };
85}
86
87impl WampMessage for Unregistered {
88 const ID: u64 = 67;
89
90 fn direction(role: Roles) -> &'static MessageDirection {
91 match role {
92 Roles::Callee => &MessageDirection {
93 receives: &true,
94 sends: &false,
95 },
96 Roles::Caller => &MessageDirection {
97 receives: &false,
98 sends: &false,
99 },
100 Roles::Publisher => &MessageDirection {
101 receives: &false,
102 sends: &false,
103 },
104 Roles::Subscriber => &MessageDirection {
105 receives: &false,
106 sends: &false,
107 },
108 Roles::Dealer => &MessageDirection {
109 receives: &false,
110 sends: &true,
111 },
112 Roles::Broker => &MessageDirection {
113 receives: &false,
114 sends: &false,
115 },
116 }
117 }
118}
119
120impl Serialize for Unregistered {
121 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
122 where
123 S: serde::Serializer,
124 {
125 (Self::ID, &self.request_id).serialize(serializer)
126 }
127}
128
129impl<'de> Deserialize<'de> for Unregistered {
130 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
131 where
132 D: Deserializer<'de>,
133 {
134 struct UnregisteredVisitor(PhantomData<u64>, PhantomData<u64>, PhantomData<u64>);
135
136 impl<'vi> Visitor<'vi> for UnregisteredVisitor {
137 type Value = Unregistered;
138 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
139 formatter.write_str("A sequence of Unregistered components.")
140 }
141
142 fn visit_seq<A>(self, mut seq: A) -> Result<Self::Value, A::Error>
143 where
144 A: SeqAccess<'vi>,
145 {
146 let message_id: u64 = helpers::deser_seq_element(
147 &mut seq,
148 "Message ID must be present and type u8.",
149 )?;
150 helpers::validate_id::<Unregistered, A, _>(&message_id, "Unregistered")?;
151 let request_id: u64 = helpers::deser_seq_element(
152 &mut seq,
153 "request_id must be present and type u64.",
154 )?;
155 Ok(Unregistered { request_id })
156 }
157 }
158
159 deserializer.deserialize_struct(
160 "Unregistered",
161 &["request_id", "registration"],
162 UnregisteredVisitor(PhantomData, PhantomData, PhantomData),
163 )
164 }
165}
166
167#[cfg(test)]
168mod tests {
169 use serde_json::{from_str, to_string};
170
171 use super::Unregistered;
172
173 #[test]
174 fn test() {
175 let d1 = r#"[67,788923562]"#;
176 let p1 = Unregistered {
177 request_id: 788923562,
178 };
179 assert_eq!(d1, to_string(&p1).unwrap());
180 assert_eq!(from_str::<Unregistered>(d1).unwrap(), p1);
181 }
182}