aldrin_core/ids/
channel_cookie.rs

1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, Introspectable, LexicalId, References};
3use crate::tags::{self, KeyTag, PrimaryKeyTag, PrimaryTag, Receiver, Sender, Tag};
4use crate::{
5    Deserialize, DeserializeError, DeserializeKey, Deserializer, Serialize, SerializeError,
6    SerializeKey, Serializer,
7};
8use std::fmt;
9use std::str::FromStr;
10use uuid::{Error as UuidError, Uuid};
11
12/// Cookie of a channel.
13///
14/// [`ChannelCookie`s](Self) are chosen by the broker when creating a channel.
15#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
16#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
17#[cfg_attr(
18    feature = "serde",
19    derive(serde::Serialize, serde::Deserialize),
20    serde(transparent)
21)]
22#[repr(transparent)]
23pub struct ChannelCookie(pub Uuid);
24
25impl ChannelCookie {
26    /// Nil `ChannelCookie` (all zeros).
27    pub const NIL: Self = Self(Uuid::nil());
28
29    /// Creates a [`ChannelCookie`] with a random v4 UUID.
30    ///
31    /// # Examples
32    ///
33    /// ```
34    /// # use aldrin_core::ChannelCookie;
35    /// let channel_cookie = ChannelCookie::new_v4();
36    /// ```
37    #[cfg(feature = "new-v4-ids")]
38    pub fn new_v4() -> Self {
39        Self(Uuid::new_v4())
40    }
41
42    /// Checks if the id is nil (all zeros).
43    pub const fn is_nil(self) -> bool {
44        self.0.is_nil()
45    }
46}
47
48impl Tag for ChannelCookie {}
49
50impl PrimaryTag for ChannelCookie {
51    type Tag = Self;
52}
53
54impl Serialize<Self> for ChannelCookie {
55    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
56        serializer.serialize_uuid(self.0)
57    }
58}
59
60impl Serialize<ChannelCookie> for &ChannelCookie {
61    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
62        serializer.serialize::<ChannelCookie>(*self)
63    }
64}
65
66impl Deserialize<Self> for ChannelCookie {
67    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
68        deserializer.deserialize_uuid().map(Self)
69    }
70}
71
72impl Serialize<tags::Uuid> for ChannelCookie {
73    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
74        serializer.serialize::<Self>(self)
75    }
76}
77
78impl Serialize<tags::Uuid> for &ChannelCookie {
79    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
80        serializer.serialize::<tags::Uuid>(*self)
81    }
82}
83
84impl Deserialize<tags::Uuid> for ChannelCookie {
85    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
86        deserializer.deserialize::<Self, _>()
87    }
88}
89
90impl<T: Tag> Serialize<Sender<T>> for ChannelCookie {
91    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
92        serializer.serialize_sender(self)
93    }
94}
95
96impl<T: Tag> Serialize<Sender<T>> for &ChannelCookie {
97    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
98        serializer.serialize::<Sender<T>>(*self)
99    }
100}
101
102impl<T: Tag> Deserialize<Sender<T>> for ChannelCookie {
103    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
104        deserializer.deserialize_sender()
105    }
106}
107
108impl<T: Tag> Serialize<Receiver<T>> for ChannelCookie {
109    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
110        serializer.serialize_receiver(self)
111    }
112}
113
114impl<T: Tag> Serialize<Receiver<T>> for &ChannelCookie {
115    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
116        serializer.serialize::<Receiver<T>>(*self)
117    }
118}
119
120impl<T: Tag> Deserialize<Receiver<T>> for ChannelCookie {
121    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
122        deserializer.deserialize_receiver()
123    }
124}
125
126impl KeyTag for ChannelCookie {
127    type Impl = tags::Uuid;
128}
129
130impl PrimaryKeyTag for ChannelCookie {
131    type KeyTag = Self;
132}
133
134impl SerializeKey<Self> for ChannelCookie {
135    fn try_as_key(&self) -> Result<Uuid, SerializeError> {
136        Ok(self.0)
137    }
138}
139
140impl DeserializeKey<Self> for ChannelCookie {
141    fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
142        Ok(Self(key))
143    }
144}
145
146impl SerializeKey<tags::Uuid> for ChannelCookie {
147    fn try_as_key(&self) -> Result<Uuid, SerializeError> {
148        Ok(self.0)
149    }
150}
151
152impl DeserializeKey<tags::Uuid> for ChannelCookie {
153    fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
154        Ok(Self(key))
155    }
156}
157
158#[cfg(feature = "introspection")]
159impl Introspectable for ChannelCookie {
160    fn layout() -> ir::LayoutIr {
161        ir::BuiltInTypeIr::Uuid.into()
162    }
163
164    fn lexical_id() -> LexicalId {
165        LexicalId::UUID
166    }
167
168    fn add_references(_references: &mut References) {}
169}
170
171impl From<Uuid> for ChannelCookie {
172    fn from(cookie: Uuid) -> Self {
173        Self(cookie)
174    }
175}
176
177impl From<ChannelCookie> for Uuid {
178    fn from(cookie: ChannelCookie) -> Self {
179        cookie.0
180    }
181}
182
183impl fmt::Display for ChannelCookie {
184    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
185        self.0.fmt(f)
186    }
187}
188
189impl FromStr for ChannelCookie {
190    type Err = UuidError;
191
192    fn from_str(s: &str) -> Result<Self, UuidError> {
193        s.parse().map(Self)
194    }
195}