ruma_identifiers/
device_id.rs

1#[cfg(feature = "rand")]
2use crate::generate_localpart;
3
4/// A Matrix key ID.
5///
6/// Device identifiers in Matrix are completely opaque character sequences. This type is provided
7/// simply for its semantic value.
8///
9/// # Example
10///
11/// ```
12/// use ruma_identifiers::{device_id, DeviceId};
13///
14/// let random_id = DeviceId::new();
15/// assert_eq!(random_id.as_str().len(), 8);
16///
17/// let static_id = device_id!("01234567");
18/// assert_eq!(static_id.as_str(), "01234567");
19///
20/// let ref_id: &DeviceId = "abcdefghi".into();
21/// assert_eq!(ref_id.as_str(), "abcdefghi");
22///
23/// let owned_id: Box<DeviceId> = "ijklmnop".into();
24/// assert_eq!(owned_id.as_str(), "ijklmnop");
25/// ```
26#[repr(transparent)]
27#[derive(PartialEq, Eq, PartialOrd, Ord, Hash)]
28pub struct DeviceId(str);
29
30opaque_identifier!(DeviceId);
31
32impl DeviceId {
33    /// Generates a random `DeviceId`, suitable for assignment to a new device.
34    #[cfg(feature = "rand")]
35    pub fn new() -> Box<Self> {
36        Self::from_owned(generate_localpart(8))
37    }
38}
39
40#[cfg(all(test, feature = "rand"))]
41mod tests {
42    use super::DeviceId;
43
44    #[test]
45    fn generate_device_id() {
46        assert_eq!(DeviceId::new().as_str().len(), 8);
47    }
48
49    #[test]
50    fn create_device_id_from_str() {
51        let ref_id: &DeviceId = "abcdefgh".into();
52        assert_eq!(ref_id.as_str(), "abcdefgh");
53    }
54
55    #[test]
56    fn create_boxed_device_id_from_str() {
57        let box_id: Box<DeviceId> = "12345678".into();
58        assert_eq!(box_id.as_str(), "12345678");
59    }
60
61    #[test]
62    fn create_device_id_from_box() {
63        let box_str: Box<str> = "ijklmnop".into();
64        let device_id: Box<DeviceId> = DeviceId::from_owned(box_str);
65        assert_eq!(device_id.as_str(), "ijklmnop");
66    }
67}