intrepid_core/extract/
http_meta.rs1use crate::{Context, Frame, HttpFrameMeta};
2
3use super::{Extractor, MessageFrameError, MessageMetaJson};
4
5#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct HttpMeta(pub HttpFrameMeta);
8
9impl<State> Extractor<State> for HttpMeta {
10 type Error = MessageFrameError;
11
12 fn extract(frame: Frame, context: &Context<State>) -> Result<Self, Self::Error>
13 where
14 Self: Sized,
15 {
16 let MessageMetaJson(http_meta) = MessageMetaJson::<HttpFrameMeta>::extract(frame, context)?;
17
18 Ok(Self(http_meta))
19 }
20}
21
22#[tokio::test]
23async fn getting_method() -> Result<(), Box<dyn std::error::Error>> {
24 use crate::HttpRequestFrame;
25 use axum::http::Request;
26
27 let cases = [
28 "GET", "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE",
29 ];
30
31 for method in cases {
32 let request = HttpRequestFrame::from(
33 Request::builder()
34 .method(method)
35 .uri("/test")
36 .body(axum::body::Body::default())?,
37 );
38
39 let context = Context::<()>::default();
40 let HttpMeta(meta) = HttpMeta::extract(request.into_frame().await, &context)?;
41
42 assert_eq!(meta.method, method);
43 }
44
45 Ok(())
46}
47
48#[test]
49fn failure() -> Result<(), MessageFrameError> {
50 use crate::{Error, ExtractorError};
51
52 let context = Context::<()>::default();
53 let result = HttpMeta::extract_from_frame_and_state(Frame::default(), &context);
54
55 assert!(matches!(
56 result.unwrap_err(),
57 Error::ExtractorError(ExtractorError::MessageFrameError(
58 MessageFrameError::WrongFrame(_)
59 ))
60 ),);
61
62 Ok(())
63}