use serde::{Deserialize, Deserializer, Serialize, Serializer, de::Visitor};
use crate::models;
#[derive(Clone, Copy, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)]
pub enum Algorithm {
RS1,
RS512,
RS384,
RS256,
ES256K,
PS512,
PS384,
PS256,
ES512,
ES384,
EdDSA,
ES256,
__Unknown(i64),
}
impl Algorithm {
pub fn as_i64(&self) -> i64 {
match self {
Self::RS1 => -65535,
Self::RS512 => -259,
Self::RS384 => -258,
Self::RS256 => -257,
Self::ES256K => -47,
Self::PS512 => -39,
Self::PS384 => -38,
Self::PS256 => -37,
Self::ES512 => -36,
Self::ES384 => -35,
Self::EdDSA => -8,
Self::ES256 => -7,
Self::__Unknown(v) => *v,
}
}
pub fn from_i64(value: i64) -> Self {
match value {
-65535 => Self::RS1,
-259 => Self::RS512,
-258 => Self::RS384,
-257 => Self::RS256,
-47 => Self::ES256K,
-39 => Self::PS512,
-38 => Self::PS384,
-37 => Self::PS256,
-36 => Self::ES512,
-35 => Self::ES384,
-8 => Self::EdDSA,
-7 => Self::ES256,
v => Self::__Unknown(v),
}
}
}
impl serde::Serialize for Algorithm {
fn serialize<S: Serializer>(&self, serializer: S) -> Result<S::Ok, S::Error> {
serializer.serialize_i64(self.as_i64())
}
}
impl<'de> serde::Deserialize<'de> for Algorithm {
fn deserialize<D: Deserializer<'de>>(deserializer: D) -> Result<Self, D::Error> {
struct AlgorithmVisitor;
impl Visitor<'_> for AlgorithmVisitor {
type Value = Algorithm;
fn expecting(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
f.write_str("an integer")
}
fn visit_i64<E: serde::de::Error>(self, v: i64) -> Result<Self::Value, E> {
Ok(Algorithm::from_i64(v))
}
fn visit_u64<E: serde::de::Error>(self, v: u64) -> Result<Self::Value, E> {
Ok(Algorithm::from_i64(v as i64))
}
}
deserializer.deserialize_i64(AlgorithmVisitor)
}
}
impl std::fmt::Display for Algorithm {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
write!(f, "{}", self.as_i64())
}
}
impl Default for Algorithm {
fn default() -> Algorithm {
Self::RS1
}
}