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}