hypershell_reqwest_components/providers/
core_request.rs1use 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}