ruma_identifiers/
signatures.rs

1use std::{borrow::Borrow, collections::BTreeMap};
2
3use crate::{DeviceId, KeyName, ServerName, SigningKeyId, UserId};
4
5/// Map of key identifier to signature values.
6pub type EntitySignatures<K> = BTreeMap<Box<SigningKeyId<K>>, String>;
7
8/// Map of all signatures, grouped by entity
9///
10/// ```
11/// # use ruma_identifiers::{server_name, KeyId, Signatures, SigningKeyAlgorithm};
12/// let key_identifier = KeyId::from_parts(SigningKeyAlgorithm::Ed25519, "1");
13/// let mut signatures = Signatures::new();
14/// let server_name = server_name!("example.org");
15/// let signature =
16///     "YbJva03ihSj5mPk+CHMJKUKlCXCPFXjXOK6VqBnN9nA2evksQcTGn6hwQfrgRHIDDXO2le49x7jnWJHMJrJoBQ";
17/// signatures.insert(server_name, key_identifier, signature.into());
18/// ```
19#[derive(Clone, Debug, Default)]
20#[cfg_attr(
21    feature = "serde",
22    derive(serde::Serialize, serde::Deserialize),
23    serde(transparent, crate = "serde")
24)]
25pub struct Signatures<E: Ord, K: ?Sized>(BTreeMap<E, EntitySignatures<K>>);
26
27impl<E: Ord, K: ?Sized> Signatures<E, K> {
28    /// Creates an empty signature map.
29    pub fn new() -> Self {
30        Self(BTreeMap::new())
31    }
32
33    /// Add a signature for the given server name and key identifier.
34    ///
35    /// If there was already one, it is returned.
36    pub fn insert(
37        &mut self,
38        entity: E,
39        key_identifier: Box<SigningKeyId<K>>,
40        value: String,
41    ) -> Option<String> {
42        self.0.entry(entity).or_insert_with(Default::default).insert(key_identifier, value)
43    }
44
45    /// Returns a reference to the signatures corresponding to the entities.
46    pub fn get<Q>(&self, entity: &Q) -> Option<&EntitySignatures<K>>
47    where
48        E: Borrow<Q>,
49        Q: Ord + ?Sized,
50    {
51        self.0.get(entity)
52    }
53}
54
55/// Map of server signatures for an event, grouped by server.
56pub type ServerSignatures = Signatures<Box<ServerName>, Box<KeyName>>;
57
58/// Map of device signatures for an event, grouped by user.
59pub type DeviceSignatures = Signatures<UserId, Box<DeviceId>>;