aldrin_core/ids/
object_uuid.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/// UUID of an object.
13///
14/// [`ObjectUuid`s](Self) are chosen by the user when creating an object and must be unique among
15/// all objects on the bus.
16#[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    /// Nil `ObjectUuid` (all zeros).
28    pub const NIL: Self = Self(Uuid::nil());
29
30    /// Creates an [`ObjectUuid`] with a random v4 UUID.
31    ///
32    /// # Examples
33    ///
34    /// ```
35    /// # use aldrin_core::ObjectUuid;
36    /// let object_uuid = ObjectUuid::new_v4();
37    /// ```
38    #[cfg(feature = "new-v4-ids")]
39    pub fn new_v4() -> Self {
40        Self(Uuid::new_v4())
41    }
42
43    /// Checks if the id is nil (all zeros).
44    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}