wamp_core/messages/unsubscribed.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/// # Unsubscribed - [wamp-proto](https://wamp-proto.org/wamp_latest_ietf.html#name-unsubscribed-2)
10/// Represents an Unsubscribed message in the WAMP protocol.
11/// ## Examples
12/// ```
13/// use wamp_core::messages::Unsubscribed;
14/// use wamp_core::unsubscribed;
15/// # let unsubscribed_message1 = unsubscribed!(1);
16///
17/// let unsubscribed_message = Unsubscribed {
18/// request_id: 1
19/// };
20///
21/// # assert_eq!(unsubscribed_message, unsubscribed_message1);
22/// ```
23///
24/// ### Serializer
25/// Implements serde Serialize trait for Unsubscribed
26/// ```
27/// use wamp_core::messages::Unsubscribed;
28/// use serde_json::{json, to_string};
29///
30/// // Create an Unsubscribe message
31/// let unsubscribed = Unsubscribed {
32/// request_id: 1
33/// };
34///
35/// // Establish raw json data string
36/// let data = r#"[35,1]"#;
37///
38/// // Here we convert it from an `Unsubscribed` frame, to a string representation.
39/// let unsubscribed = to_string(&unsubscribed).unwrap();
40///
41/// // Confirm that our Unsubscribed frame strings are equal to each other
42/// assert_eq!(unsubscribed, data);
43/// ```
44/// ### Deserializer
45/// Implements serde Deserialize trait for Unsubscribed
46/// ```
47/// use wamp_core::messages::Unsubscribed;
48/// use serde_json::from_str;
49///
50/// // Here is our raw json data string
51/// let data = r#"[35,1]"#;
52///
53/// // Here we convert it to an `Unsubscribed` frame
54/// let unsubscribed = from_str::<Unsubscribed>(data).unwrap();
55///
56/// // Confirm that our request_id and subscription deserialized
57/// assert_eq!(unsubscribed.request_id, 1);
58/// ```
59pub struct Unsubscribed {
60 pub request_id: u64,
61}
62
63#[macro_export]
64/// # Unsubscribed Macro - [wamp-proto](https://wamp-proto.org/wamp_latest_ietf.html#name-unsubscribed-2)
65/// Quicly create Unsubscribed message with this macro.
66/// ## Examples
67/// ```
68/// use wamp_core::messages::Unsubscribed;
69/// use wamp_core::unsubscribed;
70///
71/// # let unsubscribed_message1 = unsubscribed!(1);
72///
73/// let unsubscribed_message = Unsubscribed {
74/// request_id: 1
75/// };
76///
77/// # assert_eq!(unsubscribed_message, unsubscribed_message1);
78/// ```
79macro_rules! unsubscribed {
80 ($request_id:expr) => {
81 Unsubscribed {
82 request_id: $request_id,
83 }
84 };
85}
86
87impl WampMessage for Unsubscribed {
88 const ID: u64 = 35;
89
90 fn direction(role: Roles) -> &'static MessageDirection {
91 match role {
92 Roles::Callee => &MessageDirection {
93 receives: &false,
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: &true,
106 sends: &false,
107 },
108 Roles::Dealer => &MessageDirection {
109 receives: &false,
110 sends: &false,
111 },
112 Roles::Broker => &MessageDirection {
113 receives: &false,
114 sends: &true,
115 },
116 }
117 }
118}
119
120impl Serialize for Unsubscribed {
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 Unsubscribed {
130 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
131 where
132 D: Deserializer<'de>,
133 {
134 struct UnsubscribedVisitor(PhantomData<u64>, PhantomData<u64>, PhantomData<u64>);
135
136 impl<'vi> Visitor<'vi> for UnsubscribedVisitor {
137 type Value = Unsubscribed;
138 fn expecting(&self, formatter: &mut Formatter) -> std::fmt::Result {
139 formatter.write_str("A sequence of Unsubscribed 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::<Unsubscribed, A, _>(&message_id, "Unsubscribed")?;
151 let request_id: u64 = helpers::deser_seq_element(
152 &mut seq,
153 "request_id must be present and type u64.",
154 )?;
155 Ok(Unsubscribed { request_id })
156 }
157 }
158
159 deserializer.deserialize_struct(
160 "Unsubscribed",
161 &["request_id", "registration"],
162 UnsubscribedVisitor(PhantomData, PhantomData, PhantomData),
163 )
164 }
165}