use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Claims {
pub subject: String,
#[serde(default)]
pub roles: Vec<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub extra: Option<std::collections::HashMap<String, serde_json::Value>>,
}
impl Claims {
pub fn new(subject: &str) -> Self {
Self {
subject: subject.to_string(),
roles: vec![],
extra: None,
}
}
pub fn with_role(mut self, role: &str) -> Self {
self.roles.push(role.to_string());
self
}
pub fn with_roles(mut self, roles: Vec<&str>) -> Self {
self.roles.extend(roles.into_iter().map(String::from));
self
}
pub fn has_role(&self, role: &str) -> bool {
self.roles.iter().any(|r| r == role)
}
}
impl Default for Claims {
fn default() -> Self {
Self::new("anonymous")
}
}