feature_probe_server/
secrets.rs

1use std::{collections::HashMap, ops::Deref};
2
3use serde::Deserialize;
4
5type ClientSdkKey = String;
6type ServerSdkKey = String;
7
8#[derive(Deserialize, Debug, Default, Clone)]
9pub struct SecretMapping {
10    version: u128,
11    mapping: HashMap<ClientSdkKey, ServerSdkKey>,
12    #[serde(skip)]
13    reverse: HashMap<ServerSdkKey, ClientSdkKey>,
14}
15
16impl SecretMapping {
17    #[cfg(test)]
18    pub fn new(version: u128, mapping: HashMap<ClientSdkKey, ServerSdkKey>) -> Self {
19        let mut reverse = HashMap::new();
20        for (k, v) in &mapping {
21            reverse.insert(v.clone(), k.clone());
22        }
23        Self {
24            version,
25            mapping,
26            reverse,
27        }
28    }
29
30    pub fn version(&self) -> u128 {
31        self.version
32    }
33
34    pub fn update_mapping(&mut self, new: SecretMapping) {
35        if new.version > self.version {
36            self.version = new.version;
37            self.mapping = new.mapping;
38
39            let mut reverse = HashMap::new();
40            for (k, v) in &self.mapping {
41                reverse.insert(v.clone(), k.clone());
42            }
43
44            self.reverse = reverse;
45        }
46    }
47
48    pub fn client_sdk_key(&self, server_sdk_key: &str) -> Option<&String> {
49        self.reverse.get(server_sdk_key)
50    }
51
52    pub fn server_sdk_key(&self, client_sdk_key: &str) -> Option<&String> {
53        self.mapping.get(client_sdk_key)
54    }
55
56    pub fn server_sdk_keys(&self) -> Vec<&String> {
57        self.reverse.keys().into_iter().collect()
58    }
59
60    pub fn mapping_clone(&self) -> HashMap<String, String> {
61        self.mapping.clone()
62    }
63
64    pub fn insert(&mut self, client_sdk_key: String, server_sdk_key: String, version: u128) {
65        self.version = version;
66        self.mapping
67            .insert(client_sdk_key.clone(), server_sdk_key.clone());
68        self.reverse.insert(server_sdk_key, client_sdk_key);
69    }
70
71    pub fn contains_server_sdk_key(&self, server_sdk_key: &str) -> bool {
72        self.reverse.contains_key(server_sdk_key)
73    }
74}
75
76impl Deref for SecretMapping {
77    type Target = HashMap<ClientSdkKey, ServerSdkKey>;
78
79    fn deref(&self) -> &Self::Target {
80        &self.mapping
81    }
82}