use serde::{Deserialize, Serialize};
use uuid::Uuid;
use crate::types::{tid_issued_at, NumericDate};
#[derive(Serialize, Deserialize, Default, Clone, Copy, Debug, PartialEq, Eq)]
pub struct NoApp {}
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct Clauses<T> {
#[serde(default)]
pub exp: Option<NumericDate>,
#[serde(default)]
pub tid: Option<Uuid>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub iss: Option<String>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub aud: Option<Vec<String>>,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub sub: Option<String>,
#[serde(flatten)]
pub app: T,
}
#[derive(Debug)]
pub struct Mandate<T> {
pub(crate) inner: Clauses<T>,
}
impl<T> Mandate<T> {
pub fn exp(&self) -> NumericDate {
self.inner.exp.expect("verified mandate has exp")
}
pub fn tid(&self) -> Uuid {
self.inner.tid.expect("verified mandate has tid")
}
pub fn issued_at(&self) -> NumericDate {
tid_issued_at(self.tid())
}
pub fn issuer(&self) -> Option<&str> {
self.inner.iss.as_deref()
}
pub fn audience(&self) -> Option<&[String]> {
self.inner.aud.as_deref()
}
pub fn subject(&self) -> Option<&str> {
self.inner.sub.as_deref()
}
pub fn app(&self) -> &T {
&self.inner.app
}
pub fn into_app(self) -> T {
self.inner.app
}
}
#[derive(Serialize, Deserialize, Debug)]
pub(crate) struct Claims<T> {
pub iss: String,
#[serde(skip_serializing_if = "Option::is_none", default)]
pub exp: Option<NumericDate>,
#[serde(flatten)]
pub app: T,
}
#[derive(Debug)]
pub struct Manifest<T> {
pub(crate) inner: Claims<T>,
}
impl<T> Manifest<T> {
pub fn issuer(&self) -> &str {
&self.inner.iss
}
pub fn exp(&self) -> Option<NumericDate> {
self.inner.exp
}
pub fn app(&self) -> &T {
&self.inner.app
}
pub fn into_app(self) -> T {
self.inner.app
}
}