intrepid_core/extract/
http_get.rs

1use crate::{Context, Frame, HttpFrameMeta};
2
3use super::{Extractor, MessageFrameError, MessageMetaJson, MetaMismatchError};
4
5/// Extract the URI of a message from a frame.
6#[derive(Debug, Clone, PartialEq, Eq)]
7pub struct HttpGet;
8
9impl<State> Extractor<State> for HttpGet {
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        if http_meta.method != "GET" {
19            return Err(MetaMismatchError(http_meta.method))?;
20        }
21
22        Ok(Self)
23    }
24}
25
26#[tokio::test]
27async fn extracting_different_methods() -> Result<(), Box<dyn std::error::Error>> {
28    use crate::HttpRequestFrame;
29    use axum::http::Request;
30
31    let request = HttpRequestFrame::from(Request::get("/test").body(axum::body::Body::default())?);
32
33    let context = Context::<()>::default();
34    let extraction = HttpGet::extract(request.into_frame().await, &context);
35
36    assert!(extraction.is_ok());
37
38    let failure_cases = [
39        "POST", "PUT", "DELETE", "HEAD", "OPTIONS", "CONNECT", "PATCH", "TRACE",
40    ];
41
42    for method in failure_cases {
43        let request = HttpRequestFrame::from(
44            Request::builder()
45                .method(method)
46                .uri("/test")
47                .body(axum::body::Body::default())?,
48        );
49
50        let context = Context::<()>::default();
51        let extraction = HttpGet::extract(request.into_frame().await, &context);
52
53        assert!(matches!(
54            extraction.unwrap_err(),
55            MessageFrameError::MetaMismatch(MetaMismatchError(_))
56        ));
57    }
58
59    Ok(())
60}
61
62#[test]
63fn failure() -> Result<(), MessageFrameError> {
64    use crate::{Error, ExtractorError};
65
66    let context = Context::<()>::default();
67    let result = HttpGet::extract_from_frame_and_state(Frame::default(), &context);
68
69    assert!(matches!(
70        result.unwrap_err(),
71        Error::ExtractorError(ExtractorError::MessageFrameError(
72            MessageFrameError::WrongFrame(_)
73        ))
74    ),);
75
76    Ok(())
77}