use alloc::string::String;
use serde::{Deserialize, Serialize};
#[non_exhaustive]
#[derive(Debug, Clone, Hash, PartialEq, Eq)]
pub enum KeyOperation {
Sign,
Verify,
Encrypt,
Decrypt,
WrapKey,
UnwrapKey,
DeriveKey,
DeriveBits,
Other(String),
}
impl Serialize for KeyOperation {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::Serializer,
{
match self {
Self::Sign => "sign",
Self::Verify => "verify",
Self::Encrypt => "encrypt",
Self::Decrypt => "decrypt",
Self::WrapKey => "wrapKey",
Self::UnwrapKey => "unwrapKey",
Self::DeriveKey => "deriveKey",
Self::DeriveBits => "deriveBits",
Self::Other(s) => s,
}
.serialize(serializer)
}
}
impl<'de> Deserialize<'de> for KeyOperation {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let val = <alloc::borrow::Cow<'_, str>>::deserialize(deserializer)?;
Ok(match &*val {
"sign" => Self::Sign,
"verify" => Self::Verify,
"encrypt" => Self::Encrypt,
"decrypt" => Self::Decrypt,
"wrapKey" => Self::WrapKey,
"unwrapKey" => Self::UnwrapKey,
"deriveKey" => Self::DeriveKey,
"deriveBits" => Self::DeriveBits,
_ => Self::Other(val.into_owned()),
})
}
}