aldrin_core/ids/
channel_cookie.rs1#[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#[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 pub const NIL: Self = Self(Uuid::nil());
28
29 #[cfg(feature = "new-v4-ids")]
38 pub fn new_v4() -> Self {
39 Self(Uuid::new_v4())
40 }
41
42 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}