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