use serde::{Deserialize, Serialize};
use uuid::Uuid;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(untagged)]
pub enum Claims {
Identity(IdentityClaims),
Service(ServiceClaims),
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct IdentityClaims {
pub sub: Uuid,
pub email: String,
#[serde(rename = "type")]
pub ty: TokenType,
pub identity_nonce: String,
pub country: String,
}
#[derive(Debug, Clone, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub struct ServiceClaims {
#[serde(rename = "type")]
pub ty: TokenType,
pub common_name: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum TokenType {
#[serde(rename = "app")]
Application,
#[serde(rename = "org")]
Global,
}
impl From<IdentityClaims> for Claims {
fn from(value: IdentityClaims) -> Self {
Claims::Identity(value)
}
}
impl From<ServiceClaims> for Claims {
fn from(value: ServiceClaims) -> Self {
Claims::Service(value)
}
}
#[derive(Deserialize)]
#[serde(untagged)]
pub(crate) enum ClaimsExtra {
Identity {
email: String,
identity_nonce: String,
country: String,
#[serde(rename = "type")]
ty: TokenType,
},
Service(ServiceClaims),
}
impl Default for ClaimsExtra {
fn default() -> Self {
ClaimsExtra::Service(ServiceClaims {
common_name: "".into(),
ty: TokenType::Application,
})
}
}