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>>;