aldrin_core/ids/
object_cookie.rs

1#[cfg(feature = "introspection")]
2use crate::introspection::{ir, Introspectable, LexicalId, References};
3use crate::tags::{self, KeyTag, PrimaryKeyTag, PrimaryTag, 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 an object.
13///
14/// [`ObjectCookie`s](Self) are chosen by the broker when creating an object. They ensure that
15/// objects, created and destroyed over time with the same [`ObjectUuid`](super::ObjectUuid), can
16/// still be distinguished.
17#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, PartialOrd, Ord, Default)]
18#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
19#[cfg_attr(
20    feature = "serde",
21    derive(serde::Serialize, serde::Deserialize),
22    serde(transparent)
23)]
24#[repr(transparent)]
25pub struct ObjectCookie(pub Uuid);
26
27impl ObjectCookie {
28    /// Nil `ObjectCookie` (all zeros).
29    pub const NIL: Self = Self(Uuid::nil());
30
31    /// Creates an [`ObjectCookie`] with a random v4 UUID.
32    ///
33    /// # Examples
34    ///
35    /// ```
36    /// # use aldrin_core::ObjectCookie;
37    /// let object_cookie = ObjectCookie::new_v4();
38    /// ```
39    #[cfg(feature = "new-v4-ids")]
40    pub fn new_v4() -> Self {
41        Self(Uuid::new_v4())
42    }
43
44    /// Checks if the id is nil (all zeros).
45    pub const fn is_nil(self) -> bool {
46        self.0.is_nil()
47    }
48}
49
50impl Tag for ObjectCookie {}
51
52impl PrimaryTag for ObjectCookie {
53    type Tag = Self;
54}
55
56impl Serialize<Self> for ObjectCookie {
57    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
58        serializer.serialize_uuid(self.0)
59    }
60}
61
62impl Serialize<ObjectCookie> for &ObjectCookie {
63    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
64        serializer.serialize::<ObjectCookie>(*self)
65    }
66}
67
68impl Deserialize<Self> for ObjectCookie {
69    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
70        deserializer.deserialize_uuid().map(Self)
71    }
72}
73
74impl Serialize<tags::Uuid> for ObjectCookie {
75    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
76        serializer.serialize::<Self>(self)
77    }
78}
79
80impl Serialize<tags::Uuid> for &ObjectCookie {
81    fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
82        serializer.serialize::<tags::Uuid>(*self)
83    }
84}
85
86impl Deserialize<tags::Uuid> for ObjectCookie {
87    fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
88        deserializer.deserialize::<Self, _>()
89    }
90}
91
92impl KeyTag for ObjectCookie {
93    type Impl = tags::Uuid;
94}
95
96impl PrimaryKeyTag for ObjectCookie {
97    type KeyTag = Self;
98}
99
100impl SerializeKey<Self> for ObjectCookie {
101    fn try_as_key(&self) -> Result<Uuid, SerializeError> {
102        Ok(self.0)
103    }
104}
105
106impl DeserializeKey<Self> for ObjectCookie {
107    fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
108        Ok(Self(key))
109    }
110}
111
112impl SerializeKey<tags::Uuid> for ObjectCookie {
113    fn try_as_key(&self) -> Result<Uuid, SerializeError> {
114        Ok(self.0)
115    }
116}
117
118impl DeserializeKey<tags::Uuid> for ObjectCookie {
119    fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
120        Ok(Self(key))
121    }
122}
123
124#[cfg(feature = "introspection")]
125impl Introspectable for ObjectCookie {
126    fn layout() -> ir::LayoutIr {
127        ir::BuiltInTypeIr::Uuid.into()
128    }
129
130    fn lexical_id() -> LexicalId {
131        LexicalId::UUID
132    }
133
134    fn add_references(_references: &mut References) {}
135}
136
137impl From<Uuid> for ObjectCookie {
138    fn from(cookie: Uuid) -> Self {
139        Self(cookie)
140    }
141}
142
143impl From<ObjectCookie> for Uuid {
144    fn from(cookie: ObjectCookie) -> Self {
145        cookie.0
146    }
147}
148
149impl fmt::Display for ObjectCookie {
150    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
151        self.0.fmt(f)
152    }
153}
154
155impl FromStr for ObjectCookie {
156    type Err = UuidError;
157
158    fn from_str(s: &str) -> Result<Self, UuidError> {
159        s.parse().map(Self)
160    }
161}