use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct JwtClaims {
#[serde(skip_serializing_if = "Option::is_none")]
pub iss: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub sub: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub aud: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub exp: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub nbf: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub iat: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub jti: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_claims: Option<HashMap<String, serde_json::Value>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub metadata: Option<serde_json::Value>,
}
impl JwtClaims {
pub fn new() -> Self {
Self {
iss: None,
sub: None,
aud: None,
exp: None,
nbf: None,
iat: None,
jti: None,
custom_claims: None,
metadata: None,
}
}
pub fn with_subject(sub: String, exp: i64) -> Self {
Self {
sub: Some(sub),
exp: Some(exp),
..Default::default()
}
}
pub fn with_issuer(mut self, iss: String) -> Self {
self.iss = Some(iss);
self
}
pub fn with_audience(mut self, aud: String) -> Self {
self.aud = Some(aud);
self
}
pub fn with_issued_at(mut self, iat: i64) -> Self {
self.iat = Some(iat);
self
}
pub fn with_not_before(mut self, nbf: i64) -> Self {
self.nbf = Some(nbf);
self
}
pub fn with_id(mut self, jti: String) -> Self {
self.jti = Some(jti);
self
}
pub fn with_custom_claim(mut self, key: String, value: serde_json::Value) -> Self {
self.custom_claims
.get_or_insert_with(HashMap::new)
.insert(key, value);
self
}
pub fn with_custom_claims(mut self, claims: HashMap<String, serde_json::Value>) -> Self {
self.custom_claims = Some(claims);
self
}
pub fn with_metadata(mut self, metadata: serde_json::Value) -> Self {
self.metadata = Some(metadata);
self
}
}
impl Default for JwtClaims {
fn default() -> Self {
Self::new()
}
}