use std::convert::Infallible;
use warp::Filter;
use crate::guard::Guard;
pub fn with_guard(guard: Guard) -> impl Filter<Extract = (Guard,), Error = Infallible> + Clone {
warp::any().map(move || guard.clone())
}
#[cfg(test)]
mod tests {
use super::*;
use warp::Filter;
fn guard() -> Guard {
Guard::from_master_key(&[7u8; 32], "aes-256-gcm").unwrap()
}
#[tokio::test]
async fn filter_yields_the_guard() {
let route = warp::any()
.and(with_guard(guard()))
.map(|g: Guard| g.identifiers().len().to_string());
let value = warp::test::request().filter(&route).await.unwrap();
assert_eq!(value, "5");
}
#[tokio::test]
async fn handler_and_state_share_one_encrypter() {
let state = guard();
let token = state.encrypt("共享".as_bytes()).unwrap();
let route = warp::any().and(with_guard(guard())).map(move |g: Guard| {
g.decrypt(&token)
.map(|plain| String::from_utf8_lossy(&plain).into_owned())
.unwrap_or_else(|_| "解不开".into())
});
let value = warp::test::request().filter(&route).await.unwrap();
assert_eq!(value, "共享");
}
#[tokio::test]
async fn filter_is_cloneable_and_reusable() {
let filter = with_guard(guard());
let a = filter.clone();
let b = filter;
let route_a = warp::any().and(a).map(|g: Guard| g.identifiers().len());
let route_b = warp::any().and(b).map(|g: Guard| g.identifiers().len());
assert_eq!(warp::test::request().filter(&route_a).await.unwrap(), 5);
assert_eq!(warp::test::request().filter(&route_b).await.unwrap(), 5);
}
}