use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum Permission {
Read,
Write,
}
impl std::fmt::Display for Permission {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Permission::Read => write!(f, "read"),
Permission::Write => write!(f, "write"),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
pub struct TokenClaims {
pub sub: String,
#[serde(default)]
pub exp: Option<i64>,
#[serde(default)]
pub permissions: Vec<Permission>,
#[serde(default)]
pub allowed_paths: Vec<String>,
}
impl TokenClaims {
pub fn is_expired(&self, now: i64) -> bool {
self.exp.is_some_and(|exp| now >= exp)
}
pub fn has_permission(&self, perm: Permission) -> bool {
self.permissions.contains(&perm)
}
}