diff --git a/Cargo.toml b/Cargo.toml index 6f1246a..1f6baeb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -21,8 +21,12 @@ redis = { version = "0.7.0", optional = true } r2d2_redis = { version = "0.5.0", optional = true } r2d2 = { version = "0.7.1", optional = true } +serde = { version = "1.0", optional = true } +serde_json = { version = "1.0", optional = true } + [features] redis-backend = ["redis", "r2d2_redis", "r2d2"] +serde-values = ["serde", "serde_json"] [dev-dependencies] router = "0.5.0" diff --git a/src/lib.rs b/src/lib.rs index 16ff3de..56ef675 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -6,6 +6,8 @@ extern crate rand; #[cfg(feature = "redis-backend")] extern crate redis; #[cfg(feature = "redis-backend")] extern crate r2d2; #[cfg(feature = "redis-backend")] extern crate r2d2_redis; +#[cfg(feature = "serde-values")] extern crate serde; +#[cfg(feature = "serde-values")] extern crate serde_json; use iron::prelude::*; use iron::middleware::{AroundMiddleware,Handler}; @@ -79,6 +81,27 @@ pub trait Value: Sized + 'static { fn from_raw(value: String) -> Option; } +pub trait Key { + fn get_key() -> &'static str; +} + +#[cfg(feature = "serde-values")] +impl Value for T +where + T: 'static + Key + serde::Serialize + serde::de::DeserializeOwned, +{ + fn get_key() -> &'static str { + Self::get_key() + } + fn into_raw(self) -> String { + serde_json::to_string(&self).expect("serializing self must not fail") + } + fn from_raw(value: String) -> Option { + serde_json::from_str(&value).ok() + } +} + + impl Session { /// Get a `Value` from the session. pub fn get(&self) -> IronResult> {