use serde_json::Value; use serde::de::DeserializeOwned; use serde::Serialize; use json_dotpath::DotPaths; pub type Session<'a> = rocket_session::Session<'a, serde_json::Map>; pub trait SessionAccess { fn get(&self, path: &str) -> Option; fn get_or(&self, path: &str, def: T) -> T; fn get_or_else T>(&self, path: &str, def: F) -> T; fn get_or_default(&self, path: &str) -> T; fn take(&self, path: &str) -> Option; fn replace(&self, path: &str, new: N) -> Option; fn set(&self, path: &str, value: T); fn remove(&self, path: &str) -> bool; } impl<'a> SessionAccess for Session<'a> { fn get(&self, path: &str) -> Option { self.tap(|data| data.dot_get(path)) } fn get_or(&self, path: &str, def: T) -> T { self.get(path).unwrap_or(def) } fn get_or_else T>(&self, path: &str, def: F) -> T { self.get(path).unwrap_or_else(def) } fn get_or_default(&self, path: &str) -> T { self.get(path).unwrap_or_default() } fn take(&self, path: &str) -> Option { self.tap(|data| data.dot_take(path)) } fn replace(&self, path: &str, new: N) -> Option { self.tap(|data| data.dot_replace(path, new)) } fn set(&self, path: &str, value: T) { self.tap(|data| data.dot_set(path, value)); } fn remove(&self, path: &str) -> bool { self.tap(|data| data.dot_remove(path)) } }