ruma_common/
identifiers.rs

1//! Types for [Matrix](https://matrix.org/) identifiers for devices, events, keys, rooms, servers,
2//! users and URIs.
3
4// FIXME: Remove once lint doesn't trigger on std::convert::TryFrom in identifiers/macros.rs anymore
5#![allow(unused_qualifications)]
6
7#[doc(inline)]
8pub use ruma_identifiers_validation::{
9    error::{
10        Error as IdParseError, MatrixIdError, MatrixToError, MatrixUriError, MxcUriError,
11        VoipVersionIdError,
12    },
13    KeyName, ID_MAX_BYTES,
14};
15use serde::de::{self, Deserializer, Unexpected};
16
17#[doc(inline)]
18pub use self::{
19    base64_public_key::{Base64PublicKey, OwnedBase64PublicKey},
20    base64_public_key_or_device_id::{Base64PublicKeyOrDeviceId, OwnedBase64PublicKeyOrDeviceId},
21    client_secret::{ClientSecret, OwnedClientSecret},
22    crypto_algorithms::{
23        DeviceKeyAlgorithm, EventEncryptionAlgorithm, KeyDerivationAlgorithm, OneTimeKeyAlgorithm,
24        SigningKeyAlgorithm,
25    },
26    device_id::{DeviceId, OwnedDeviceId},
27    event_id::{EventId, OwnedEventId},
28    key_id::{
29        AnyKeyName, CrossSigningKeyId, CrossSigningOrDeviceSigningKeyId, DeviceKeyId,
30        DeviceSigningKeyId, KeyAlgorithm, KeyId, OneTimeKeyId, OwnedCrossSigningKeyId,
31        OwnedCrossSigningOrDeviceSigningKeyId, OwnedDeviceKeyId, OwnedDeviceSigningKeyId,
32        OwnedKeyId, OwnedOneTimeKeyId, OwnedServerSigningKeyId, OwnedSigningKeyId,
33        ServerSigningKeyId, SigningKeyId,
34    },
35    matrix_uri::{MatrixToUri, MatrixUri},
36    mxc_uri::{MxcUri, OwnedMxcUri},
37    one_time_key_name::{OneTimeKeyName, OwnedOneTimeKeyName},
38    room_alias_id::{OwnedRoomAliasId, RoomAliasId},
39    room_id::{OwnedRoomId, RoomId},
40    room_or_alias_id::{OwnedRoomOrAliasId, RoomOrAliasId},
41    room_version_id::RoomVersionId,
42    server_name::{OwnedServerName, ServerName},
43    server_signing_key_version::{OwnedServerSigningKeyVersion, ServerSigningKeyVersion},
44    session_id::{OwnedSessionId, SessionId},
45    signatures::{
46        CrossSigningOrDeviceSignatures, DeviceSignatures, EntitySignatures, ServerSignatures,
47        Signatures,
48    },
49    space_child_order::{OwnedSpaceChildOrder, SpaceChildOrder},
50    transaction_id::{OwnedTransactionId, TransactionId},
51    user_id::{OwnedUserId, UserId},
52    voip_id::{OwnedVoipId, VoipId},
53    voip_version_id::VoipVersionId,
54};
55
56pub mod matrix_uri;
57pub mod user_id;
58
59mod base64_public_key;
60mod base64_public_key_or_device_id;
61mod client_secret;
62mod crypto_algorithms;
63mod device_id;
64mod event_id;
65mod key_id;
66mod mxc_uri;
67mod one_time_key_name;
68mod room_alias_id;
69mod room_id;
70mod room_or_alias_id;
71mod room_version_id;
72mod server_name;
73mod server_signing_key_version;
74mod session_id;
75mod signatures;
76mod space_child_order;
77mod transaction_id;
78mod voip_id;
79mod voip_version_id;
80
81/// Generates a random identifier localpart.
82#[cfg(feature = "rand")]
83fn generate_localpart(length: usize) -> Box<str> {
84    use rand::Rng as _;
85    rand::thread_rng()
86        .sample_iter(&rand::distributions::Alphanumeric)
87        .map(char::from)
88        .take(length)
89        .collect::<String>()
90        .into_boxed_str()
91}
92
93/// Deserializes any type of id using the provided `TryFrom` implementation.
94///
95/// This is a helper function to reduce the boilerplate of the `Deserialize` implementations.
96fn deserialize_id<'de, D, T>(deserializer: D, expected_str: &str) -> Result<T, D::Error>
97where
98    D: Deserializer<'de>,
99    T: for<'a> TryFrom<&'a str>,
100{
101    crate::serde::deserialize_cow_str(deserializer).and_then(|v| {
102        T::try_from(&v).map_err(|_| de::Error::invalid_value(Unexpected::Str(&v), &expected_str))
103    })
104}
105
106/// Shorthand for `<&DeviceId>::from`.
107#[macro_export]
108macro_rules! device_id {
109    ($s:expr) => {
110        <&$crate::DeviceId as ::std::convert::From<_>>::from($s)
111    };
112}
113
114/// Shorthand for `OwnedDeviceId::from`.
115#[macro_export]
116macro_rules! owned_device_id {
117    ($s:expr) => {
118        <$crate::OwnedDeviceId as ::std::convert::From<_>>::from($s)
119    };
120}
121
122#[doc(hidden)]
123pub mod __private_macros {
124    pub use ruma_macros::{
125        base64_public_key, event_id, mxc_uri, room_alias_id, room_id, room_version_id, server_name,
126        server_signing_key_version, user_id,
127    };
128}
129
130/// Compile-time checked [`EventId`] construction.
131#[macro_export]
132macro_rules! event_id {
133    ($s:literal) => {
134        $crate::__private_macros::event_id!($crate, $s)
135    };
136}
137
138/// Compile-time checked [`OwnedEventId`] construction.
139#[macro_export]
140macro_rules! owned_event_id {
141    ($s:literal) => {
142        $crate::event_id!($s).to_owned()
143    };
144}
145
146/// Compile-time checked [`RoomAliasId`] construction.
147#[macro_export]
148macro_rules! room_alias_id {
149    ($s:literal) => {
150        $crate::__private_macros::room_alias_id!($crate, $s)
151    };
152}
153
154/// Compile-time checked [`OwnedRoomAliasId`] construction.
155#[macro_export]
156macro_rules! owned_room_alias_id {
157    ($s:literal) => {
158        $crate::room_alias_id!($s).to_owned()
159    };
160}
161
162/// Compile-time checked [`RoomId`] construction.
163#[macro_export]
164macro_rules! room_id {
165    ($s:literal) => {
166        $crate::__private_macros::room_id!($crate, $s)
167    };
168}
169
170/// Compile-time checked [`OwnedRoomId`] construction.
171#[macro_export]
172macro_rules! owned_room_id {
173    ($s:literal) => {
174        $crate::room_id!($s).to_owned()
175    };
176}
177
178/// Compile-time checked [`RoomVersionId`] construction.
179#[macro_export]
180macro_rules! room_version_id {
181    ($s:literal) => {
182        $crate::__private_macros::room_version_id!($crate, $s)
183    };
184}
185
186/// Compile-time checked [`ServerSigningKeyVersion`] construction.
187#[macro_export]
188macro_rules! server_signing_key_version {
189    ($s:literal) => {
190        $crate::__private_macros::server_signing_key_version!($crate, $s)
191    };
192}
193
194/// Compile-time checked [`OwnedServerSigningKeyVersion`] construction.
195#[macro_export]
196macro_rules! owned_server_signing_key_version {
197    ($s:literal) => {
198        $crate::server_signing_key_version!($s).to_owned()
199    };
200}
201
202/// Compile-time checked [`ServerName`] construction.
203#[macro_export]
204macro_rules! server_name {
205    ($s:literal) => {
206        $crate::__private_macros::server_name!($crate, $s)
207    };
208}
209
210/// Compile-time checked [`OwnedServerName`] construction.
211#[macro_export]
212macro_rules! owned_server_name {
213    ($s:literal) => {
214        $crate::server_name!($s).to_owned()
215    };
216}
217
218/// Compile-time checked [`SessionId`] construction.
219#[macro_export]
220macro_rules! session_id {
221    ($s:literal) => {{
222        const SESSION_ID: &$crate::SessionId = match $crate::SessionId::_priv_const_new($s) {
223            Ok(id) => id,
224            Err(e) => panic!("{}", e),
225        };
226
227        SESSION_ID
228    }};
229}
230
231/// Compile-time checked [`OwnedSessionId`] construction.
232#[macro_export]
233macro_rules! owned_session_id {
234    ($s:literal) => {
235        $crate::session_id!($s).to_owned()
236    };
237}
238
239/// Compile-time checked [`MxcUri`] construction.
240#[macro_export]
241macro_rules! mxc_uri {
242    ($s:literal) => {
243        $crate::__private_macros::mxc_uri!($crate, $s)
244    };
245}
246
247/// Compile-time checked [`OwnedMxcUri`] construction.
248#[macro_export]
249macro_rules! owned_mxc_uri {
250    ($s:literal) => {
251        $crate::mxc_uri!($s).to_owned()
252    };
253}
254
255/// Compile-time checked [`UserId`] construction.
256#[macro_export]
257macro_rules! user_id {
258    ($s:literal) => {
259        $crate::__private_macros::user_id!($crate, $s)
260    };
261}
262
263/// Compile-time checked [`OwnedUserId`] construction.
264#[macro_export]
265macro_rules! owned_user_id {
266    ($s:literal) => {
267        $crate::user_id!($s).to_owned()
268    };
269}
270
271/// Compile-time checked [`Base64PublicKey`] construction.
272#[macro_export]
273macro_rules! base64_public_key {
274    ($s:literal) => {
275        $crate::__private_macros::base64_public_key!($crate, $s)
276    };
277}
278
279/// Compile-time checked [`OwnedBase64PublicKey`] construction.
280#[macro_export]
281macro_rules! owned_base64_public_key {
282    ($s:literal) => {
283        $crate::base64_public_key!($s).to_owned()
284    };
285}