aldrin_core/ids/
object_uuid.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)]
17#[cfg_attr(feature = "fuzzing", derive(arbitrary::Arbitrary))]
18#[cfg_attr(
19 feature = "serde",
20 derive(serde::Serialize, serde::Deserialize),
21 serde(transparent)
22)]
23#[repr(transparent)]
24pub struct ObjectUuid(pub Uuid);
25
26impl ObjectUuid {
27 pub const NIL: Self = Self(Uuid::nil());
29
30 #[cfg(feature = "new-v4-ids")]
39 pub fn new_v4() -> Self {
40 Self(Uuid::new_v4())
41 }
42
43 pub const fn is_nil(self) -> bool {
45 self.0.is_nil()
46 }
47}
48
49impl Tag for ObjectUuid {}
50
51impl PrimaryTag for ObjectUuid {
52 type Tag = Self;
53}
54
55impl Serialize<Self> for ObjectUuid {
56 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
57 serializer.serialize_uuid(self.0)
58 }
59}
60
61impl Serialize<ObjectUuid> for &ObjectUuid {
62 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
63 serializer.serialize::<ObjectUuid>(*self)
64 }
65}
66
67impl Deserialize<Self> for ObjectUuid {
68 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
69 deserializer.deserialize_uuid().map(Self)
70 }
71}
72
73impl Serialize<tags::Uuid> for ObjectUuid {
74 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
75 serializer.serialize::<Self>(self)
76 }
77}
78
79impl Serialize<tags::Uuid> for &ObjectUuid {
80 fn serialize(self, serializer: Serializer) -> Result<(), SerializeError> {
81 serializer.serialize::<tags::Uuid>(*self)
82 }
83}
84
85impl Deserialize<tags::Uuid> for ObjectUuid {
86 fn deserialize(deserializer: Deserializer) -> Result<Self, DeserializeError> {
87 deserializer.deserialize::<Self, _>()
88 }
89}
90
91impl KeyTag for ObjectUuid {
92 type Impl = tags::Uuid;
93}
94
95impl PrimaryKeyTag for ObjectUuid {
96 type KeyTag = Self;
97}
98
99impl SerializeKey<Self> for ObjectUuid {
100 fn try_as_key(&self) -> Result<Uuid, SerializeError> {
101 Ok(self.0)
102 }
103}
104
105impl DeserializeKey<Self> for ObjectUuid {
106 fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
107 Ok(Self(key))
108 }
109}
110
111impl SerializeKey<tags::Uuid> for ObjectUuid {
112 fn try_as_key(&self) -> Result<Uuid, SerializeError> {
113 Ok(self.0)
114 }
115}
116
117impl DeserializeKey<tags::Uuid> for ObjectUuid {
118 fn try_from_key(key: Uuid) -> Result<Self, DeserializeError> {
119 Ok(Self(key))
120 }
121}
122
123#[cfg(feature = "introspection")]
124impl Introspectable for ObjectUuid {
125 fn layout() -> ir::LayoutIr {
126 ir::BuiltInTypeIr::Uuid.into()
127 }
128
129 fn lexical_id() -> LexicalId {
130 LexicalId::UUID
131 }
132
133 fn add_references(_references: &mut References) {}
134}
135
136impl From<Uuid> for ObjectUuid {
137 fn from(uuid: Uuid) -> Self {
138 Self(uuid)
139 }
140}
141
142impl From<ObjectUuid> for Uuid {
143 fn from(uuid: ObjectUuid) -> Self {
144 uuid.0
145 }
146}
147
148impl fmt::Display for ObjectUuid {
149 fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
150 self.0.fmt(f)
151 }
152}
153
154impl FromStr for ObjectUuid {
155 type Err = UuidError;
156
157 fn from_str(s: &str) -> Result<Self, UuidError> {
158 s.parse().map(Self)
159 }
160}