#![cfg(not(feature = "openapi"))] use http::StatusCode; use rweb::{filters::BoxedFilter, *}; use serde::Deserialize; impl FromRequest for User { type Filter = BoxedFilter<(User,)>; fn new() -> Self::Filter { let header = header::("x-user-id"); header.map(|id| User { id }).boxed() } } struct User { id: String, } #[get("/")] fn index(user: User) -> String { user.id } #[tokio::test] async fn index_test() { let value = warp::test::request() .header("x-user-id", "test-uid") .path("/") .reply(&index()) .await; assert_eq!(value.status(), StatusCode::OK); assert_eq!(value.into_body(), b"test-uid"[..]); } #[tokio::test] async fn index_test_fail() { let value = warp::test::request().path("/").reply(&index()).await; assert_eq!(value.status(), StatusCode::BAD_REQUEST); } #[derive(Deserialize)] struct LoginForm { id: String, #[allow(dead_code)] password: String, } #[get("/")] pub fn json(body: Json) -> String { body.into_inner().id } #[get("/")] pub fn form(body: Form) -> String { body.into_inner().id } #[derive(Deserialize)] struct Pagination { token: String, } #[get("/")] pub fn query(body: Query) -> String { body.into_inner().token }