feature_probe_server/
secrets.rs1use 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}