use core::str::FromStr;
use alloc::{format, string::String};
use serde::{Deserialize, Serialize};
#[derive(
Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize, strum::Display, strum::EnumIter,
)]
pub enum Kind {
#[serde(rename = "AEAD")]
Aead,
#[serde(rename = "DAEAD")]
Daead,
#[serde(rename = "MAC")]
Mac,
#[serde(rename = "DSA")]
Dsa,
}
impl Kind {
pub fn as_str(&self) -> &'static str {
match self {
Kind::Aead => "AEAD",
Kind::Daead => "DAEAD",
Kind::Mac => "MAC",
Kind::Dsa => "Signature",
}
}
pub fn as_u8(&self) -> u8 {
match self {
Kind::Aead => 0,
Kind::Daead => 1,
Kind::Mac => 3,
Kind::Dsa => 4,
}
}
pub fn is_dsa(&self) -> bool {
matches!(self, Kind::Dsa)
}
pub fn is_aead(&self) -> bool {
matches!(self, Kind::Aead)
}
pub fn is_daead(&self) -> bool {
matches!(self, Kind::Daead)
}
pub fn is_mac(&self) -> bool {
matches!(self, Kind::Mac)
}
}
impl FromStr for Kind {
type Err = String;
fn from_str(s: &str) -> Result<Self, Self::Err> {
match s.to_uppercase().as_str() {
"AEAD" => Ok(Kind::Aead),
"DAEAD" => Ok(Kind::Daead),
"MAC" => Ok(Kind::Mac),
"SIGNATURE" => Ok(Kind::Dsa),
_ => Err(format!("invalid primitive type: \"{s}\"")),
}
}
}
impl From<Kind> for u8 {
fn from(pt: Kind) -> Self {
pt.as_u8()
}
}
impl TryFrom<u8> for Kind {
type Error = String;
fn try_from(value: u8) -> Result<Self, Self::Error> {
match value {
0 => Ok(Kind::Aead),
1 => Ok(Kind::Daead),
3 => Ok(Kind::Mac),
4 => Ok(Kind::Dsa),
_ => Err(format!("invalid primitive type: \"{value}\"")),
}
}
}