rama_http/service/web/endpoint/extract/
request.rs1use super::{FromOwnedRequestParts, FromRequest};
2use crate::{Request, request::Parts};
3use std::convert::Infallible;
4
5impl FromRequest for Request {
6 type Rejection = Infallible;
7
8 async fn from_request(req: Request) -> Result<Self, Self::Rejection> {
9 Ok(req)
10 }
11}
12
13impl FromOwnedRequestParts for Parts {
14 type Rejection = Infallible;
15
16 fn from_owned_request_parts(
17 parts: Parts,
18 ) -> impl Future<Output = Result<Self, Self::Rejection>> + Send + 'static {
19 std::future::ready(Ok(parts))
20 }
21}
22
23#[cfg(test)]
24mod tests {
25 use super::*;
26 use crate::{
27 Body, Method, StatusCode,
28 body::util::BodyExt,
29 header,
30 service::web::{WebService, extract::Json, response},
31 };
32 use rama_core::Service;
33
34 #[tokio::test]
35 async fn owned_parts_compose_with_json_body_extractor() {
36 #[derive(serde::Deserialize)]
37 struct Input {
38 value: String,
39 }
40
41 let service = WebService::default().with_post(
42 "/items",
43 async |parts: Parts, Json(input): Json<Input>| -> response::Result<String> {
44 assert_eq!(parts.method, Method::POST);
45 assert_eq!(parts.uri.to_string(), "/items");
46 assert_eq!(parts.headers.get("x-request-id").unwrap(), "parts-test");
47 Ok(input.value)
48 },
49 );
50 let request = Request::builder()
51 .method(Method::POST)
52 .uri("/items")
53 .header(header::CONTENT_TYPE, "application/json")
54 .header("x-request-id", "parts-test")
55 .body(Body::from(r#"{"value":"payload"}"#))
56 .unwrap();
57
58 let response = service.serve(request).await.unwrap();
59
60 assert_eq!(response.status(), StatusCode::OK);
61 let body = response.into_body().collect().await.unwrap().to_bytes();
62 assert_eq!(body, "payload");
63 }
64}