hypershell_reqwest_components/providers/
core_request.rs

1use core::marker::PhantomData;
2
3use cgp::extra::handler::{Handler, HandlerComponent};
4use cgp::prelude::*;
5use hypershell_components::components::{CanExtractMethodArg, CanExtractUrlArg};
6use reqwest::{Body, Method, Response, Url};
7
8use crate::components::{CanUpdateRequestBuilder, HasReqwestClient};
9use crate::dsl::CoreHttpRequest;
10
11#[cgp_new_provider]
12impl<Context, MethodArg, UrlArg, Headers, Input>
13    Handler<Context, CoreHttpRequest<MethodArg, UrlArg, Headers>, Input> for HandleCoreHttpRequest
14where
15    Context: HasReqwestClient
16        + CanExtractUrlArg<UrlArg, Url = Url>
17        + CanExtractMethodArg<MethodArg, HttpMethod = Method>
18        + CanUpdateRequestBuilder<Headers>
19        + CanRaiseAsyncError<reqwest::Error>,
20    MethodArg: Send,
21    UrlArg: Send,
22    Headers: Send,
23    Input: Send + Into<Body>,
24{
25    type Output = Response;
26
27    async fn handle(
28        context: &Context,
29        _tag: PhantomData<CoreHttpRequest<MethodArg, UrlArg, Headers>>,
30        body: Input,
31    ) -> Result<Response, Context::Error> {
32        let client = context.request_client();
33        let url = context.extract_url_arg(PhantomData)?;
34        let method = context.extract_method_arg(PhantomData);
35
36        let builder = client.request(method, url);
37
38        let builder = context
39            .update_request_builder(PhantomData, builder)?
40            .body(body);
41
42        let response = builder.send().await.map_err(Context::raise_error)?;
43
44        Ok(response)
45    }
46}