use std::collections::HashMap;
#[derive(Debug, Clone, Default)]
pub struct Session {
variables: HashMap<String, String>,
}
impl Session {
pub fn new() -> Self {
Self::default()
}
pub fn from_map(variables: HashMap<String, String>) -> Self {
Self { variables }
}
pub fn user_id(&self) -> Option<&str> {
self.get("x-hasura-user-id")
}
pub fn role(&self) -> Option<&str> {
self.get("x-hasura-role")
}
pub fn get(&self, key: &str) -> Option<&str> {
self.variables.get(key).map(|v| v.as_str())
}
pub fn set(&mut self, key: impl Into<String>, value: impl Into<String>) {
self.variables.insert(key.into(), value.into());
}
pub fn has(&self, key: &str) -> bool {
self.variables.contains_key(key)
}
pub fn variables(&self) -> &HashMap<String, String> {
&self.variables
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn empty_session() {
let session = Session::new();
assert_eq!(session.user_id(), None);
assert_eq!(session.role(), None);
assert!(!session.has("anything"));
}
#[test]
fn hasura_variables() {
let mut vars = HashMap::new();
vars.insert("x-hasura-user-id".to_string(), "user-42".to_string());
vars.insert("x-hasura-role".to_string(), "customer".to_string());
let session = Session::from_map(vars);
assert_eq!(session.user_id(), Some("user-42"));
assert_eq!(session.role(), Some("customer"));
assert!(session.has("x-hasura-user-id"));
assert!(!session.has("x-hasura-admin-secret"));
}
#[test]
fn set_and_get() {
let mut session = Session::new();
session.set("x-hasura-role", "admin");
assert_eq!(session.get("x-hasura-role"), Some("admin"));
assert_eq!(session.role(), Some("admin"));
}
}