use std::collections::HashMap;
use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Deserialize)]
pub struct JwtClaims {
pub sub: Option<String>,
pub iss: Option<String>,
#[serde(default)]
pub aud: Audience,
pub exp: Option<i64>,
pub iat: Option<i64>,
pub nbf: Option<i64>,
pub jti: Option<String>,
pub scope: Option<String>,
pub scp: Option<Vec<String>>,
pub permissions: Option<Vec<String>>,
pub email: Option<serde_json::Value>,
pub email_verified: Option<bool>,
pub name: Option<serde_json::Value>,
#[serde(flatten)]
pub extra: HashMap<String, serde_json::Value>,
}
#[derive(Debug, Clone, Default, Deserialize, Serialize)]
#[serde(untagged)]
#[non_exhaustive]
pub enum Audience {
#[default]
None,
Single(String),
Multiple(Vec<String>),
}
impl Audience {
#[must_use]
pub fn contains(&self, value: &str) -> bool {
match self {
Self::None => false,
Self::Single(s) => s == value,
Self::Multiple(v) => v.iter().any(|s| s == value),
}
}
#[must_use]
pub fn to_vec(&self) -> Vec<String> {
match self {
Self::None => Vec::new(),
Self::Single(s) => vec![s.clone()],
Self::Multiple(v) => v.clone(),
}
}
}