use url::form_urlencoded;
use self::KeyManagerFactory::{Cluster, Local};
pub enum KeyManagerFactory {
Local(String),
Cluster(String),
}
impl KeyManagerFactory {
pub fn new(prefix: &str, cluster: bool) -> Self {
let prefix = prefix.to_string();
if cluster {
Cluster(prefix)
} else {
Local(prefix)
}
}
pub fn create(&self, bucket: &str, group: &str) -> KeyManager {
match self {
Local(prefix) => KeyManager::Local {
data_key: format!("{prefix}-{bucket}-{group}"),
},
Cluster(prefix) => KeyManager::Cluster {
data_key: format!("{prefix}-{bucket}-{group}"),
lock_key: format!("{prefix}-{bucket}-{group}-lock"),
storage_key: form_urlencoded::byte_serialize(
format!("{bucket}-{group}").as_bytes(),
)
.collect(),
},
}
}
}
pub enum KeyManager {
Local {
data_key: String,
},
Cluster {
data_key: String,
lock_key: String,
storage_key: String,
},
}
impl KeyManager {
pub fn data_key(&self) -> &str {
match self {
KeyManager::Local { data_key } => data_key,
KeyManager::Cluster { data_key, .. } => data_key,
}
}
pub fn storage_key(&self) -> &str {
match self {
KeyManager::Local { .. } => "",
KeyManager::Cluster { storage_key, .. } => storage_key,
}
}
pub fn lock_key(&self) -> &str {
match self {
KeyManager::Local { .. } => "",
KeyManager::Cluster { lock_key, .. } => lock_key,
}
}
}