intrepid_core/extract/
http_meta.rs

1use crate::{Context, Frame, HttpFrameMeta};
2
3use super::{Extractor, MessageFrameError, MessageMetaJson};
4
5/// Extract the URI of a message from a frame.
6#[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}