hypershell_reqwest_components/providers/
simple_request.rs

1use core::marker::PhantomData;
2
3use cgp::extra::handler::{CanHandle, Handler, HandlerComponent};
4use cgp::prelude::*;
5use hypershell_components::dsl::SimpleHttpRequest;
6use reqwest::Response;
7
8use crate::dsl::CoreHttpRequest;
9
10#[derive(Debug)]
11pub struct ErrorResponse {
12    pub response: Response,
13}
14
15#[cgp_new_provider]
16impl<Context, MethodArg, UrlArg, Headers, Input>
17    Handler<Context, SimpleHttpRequest<MethodArg, UrlArg, Headers>, Input>
18    for HandleSimpleHttpRequest
19where
20    Context: CanHandle<CoreHttpRequest<MethodArg, UrlArg, Headers>, Input, Output = Response>
21        + CanRaiseAsyncError<reqwest::Error>
22        + CanRaiseAsyncError<ErrorResponse>,
23    MethodArg: Send,
24    UrlArg: Send,
25    Headers: Send,
26    Input: Send,
27{
28    type Output = Vec<u8>;
29
30    async fn handle(
31        context: &Context,
32        _tag: PhantomData<SimpleHttpRequest<MethodArg, UrlArg, Headers>>,
33        body: Input,
34    ) -> Result<Vec<u8>, Context::Error> {
35        let response = context.handle(PhantomData, body).await?;
36
37        let status_code = response.status();
38
39        if !status_code.is_success() {
40            return Err(Context::raise_error(ErrorResponse { response }));
41        }
42
43        let response_body = response.bytes().await.map_err(Context::raise_error)?;
44
45        Ok(response_body.into())
46    }
47}