ruma_events/secret_storage/key/
secret_encryption_algorithm_serde.rs1use ruma_common::serde::JsonObject;
2use serde::{Deserialize, Serialize, de};
3
4use super::{
5 CustomSecretEncryptionAlgorithm, SecretStorageEncryptionAlgorithm,
6 SecretStorageV1AesHmacSha2Properties,
7};
8
9#[derive(Deserialize)]
10#[serde(untagged)]
11enum SecretStorageEncryptionAlgorithmDeHelper {
12 Known(KnownSecretStorageEncryptionAlgorithmDeHelper),
13 Unknown(UnknownSecretStorageEncryptionAlgorithmDeHelper),
14}
15
16#[derive(Deserialize)]
17#[serde(tag = "algorithm")]
18enum KnownSecretStorageEncryptionAlgorithmDeHelper {
19 #[serde(rename = "m.secret_storage.v1.aes-hmac-sha2")]
20 V1AesHmacSha2(SecretStorageV1AesHmacSha2Properties),
21}
22
23#[derive(Deserialize)]
24struct UnknownSecretStorageEncryptionAlgorithmDeHelper {
25 algorithm: String,
27
28 #[serde(flatten)]
30 properties: JsonObject,
31}
32
33impl<'de> Deserialize<'de> for SecretStorageEncryptionAlgorithm {
34 fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
35 where
36 D: de::Deserializer<'de>,
37 {
38 let helper = SecretStorageEncryptionAlgorithmDeHelper::deserialize(deserializer)?;
39
40 Ok(match helper {
41 SecretStorageEncryptionAlgorithmDeHelper::Known(k) => match k {
42 KnownSecretStorageEncryptionAlgorithmDeHelper::V1AesHmacSha2(p) => {
43 Self::V1AesHmacSha2(p)
44 }
45 },
46 SecretStorageEncryptionAlgorithmDeHelper::Unknown(
47 UnknownSecretStorageEncryptionAlgorithmDeHelper { algorithm, properties },
48 ) => Self::_Custom(CustomSecretEncryptionAlgorithm { algorithm, properties }),
49 })
50 }
51}
52
53#[derive(Debug, Serialize)]
54struct SecretStorageEncryptionAlgorithmSerHelper<'a, T: Serialize> {
55 algorithm: &'a str,
56 #[serde(flatten)]
57 properties: T,
58}
59
60impl Serialize for SecretStorageEncryptionAlgorithm {
61 fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
62 where
63 S: serde::Serializer,
64 {
65 match self {
66 Self::V1AesHmacSha2(properties) => {
67 let algorithm = self.algorithm();
68 SecretStorageEncryptionAlgorithmSerHelper { algorithm, properties }
69 .serialize(serializer)
70 }
71 Self::_Custom(CustomSecretEncryptionAlgorithm { algorithm, properties }) => {
72 SecretStorageEncryptionAlgorithmSerHelper { algorithm, properties }
73 .serialize(serializer)
74 }
75 }
76 }
77}