use serde::Serialize;
use serde_json;
use std::collections::HashMap;
use strum_macros::{Display, EnumString};
use crate::custom_error::KSMRError;
#[derive(Debug, Clone, Display, EnumString, Eq, PartialEq, Hash, serde::Deserialize, Serialize)]
pub enum ConfigKeys {
#[serde(rename = "url")]
KeyUrl, #[serde(rename = "clientId")]
KeyClientId,
#[serde(rename = "clientKey")]
KeyClientKey, #[serde(rename = "appKey")]
KeyAppKey, #[serde(rename = "appOwnerPublicKey")]
KeyOwnerPublicKey, #[serde(rename = "privateKey")]
KeyPrivateKey, #[serde(rename = "serverPublicKeyId")]
KeyServerPublicKeyId,
#[serde(rename = "bat")]
KeyBindingToken,
#[serde(rename = "bindingKey")]
KeyBindingKey,
#[serde(rename = "hostname")]
KeyHostname,
}
impl ConfigKeys {
pub fn value(&self) -> &str {
match self {
ConfigKeys::KeyUrl => "url",
ConfigKeys::KeyClientId => "clientId",
ConfigKeys::KeyClientKey => "clientKey",
ConfigKeys::KeyAppKey => "appKey",
ConfigKeys::KeyOwnerPublicKey => "appOwnerPublicKey",
ConfigKeys::KeyPrivateKey => "privateKey",
ConfigKeys::KeyServerPublicKeyId => "serverPublicKeyId",
ConfigKeys::KeyBindingToken => "bat",
ConfigKeys::KeyBindingKey => "bindingKey",
ConfigKeys::KeyHostname => "hostname",
}
}
pub fn key_from_str(value: &str) -> Option<Self> {
match value {
"url" => Some(ConfigKeys::KeyUrl),
"clientId" => Some(ConfigKeys::KeyClientId),
"clientKey" => Some(ConfigKeys::KeyClientKey),
"appKey" => Some(ConfigKeys::KeyAppKey),
"appOwnerPublicKey" => Some(ConfigKeys::KeyOwnerPublicKey),
"privateKey" => Some(ConfigKeys::KeyPrivateKey),
"serverPublicKeyId" => Some(ConfigKeys::KeyServerPublicKeyId),
"bat" => Some(ConfigKeys::KeyBindingToken),
"bindingKey" => Some(ConfigKeys::KeyBindingKey),
"hostname" => Some(ConfigKeys::KeyHostname),
_ => None,
}
}
pub fn get_enum(value: &str) -> Option<Self> {
match value {
"url" => Some(ConfigKeys::KeyUrl),
"clientId" => Some(ConfigKeys::KeyClientId),
"clientKey" => Some(ConfigKeys::KeyClientKey),
"appKey" => Some(ConfigKeys::KeyAppKey),
"appOwnerPublicKey" => Some(ConfigKeys::KeyOwnerPublicKey),
"privateKey" => Some(ConfigKeys::KeyPrivateKey),
"serverPublicKeyId" => Some(ConfigKeys::KeyServerPublicKeyId),
"bat" => Some(ConfigKeys::KeyBindingToken),
"bindingKey" => Some(ConfigKeys::KeyBindingKey),
"hostname" => Some(ConfigKeys::KeyHostname),
_ => None,
}
}
}
pub fn deserialize_map_from_str(json_data: &str) -> Result<HashMap<ConfigKeys, String>, KSMRError> {
let map: HashMap<String, String> = serde_json::from_str(json_data)
.map_err(|e| KSMRError::SerializationError(format!("JSON deserialization error: {}", e)))?;
let mut result = HashMap::new();
for (key, value) in map {
if let Some(enum_key) = ConfigKeys::key_from_str(&key) {
result.insert(enum_key, value);
} else {
return Err(KSMRError::SerializationError(format!(
"Failed to parse JSON: {}",
key
)));
}
}
Ok(result)
}