aldrin_core/ids/
object_cookie.rs1#[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#[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 pub const NIL: Self = Self(Uuid::nil());
30
31 #[cfg(feature = "new-v4-ids")]
40 pub fn new_v4() -> Self {
41 Self(Uuid::new_v4())
42 }
43
44 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}