hypershell-reqwest-components 0.1.0-alpha

Modular DSL for shellscripting in Rust
Documentation
use core::marker::PhantomData;

use cgp::extra::handler::{CanHandle, Handler, HandlerComponent};
use cgp::prelude::*;
use hypershell_components::dsl::SimpleHttpRequest;
use reqwest::Response;

use crate::dsl::CoreHttpRequest;

#[derive(Debug)]
pub struct ErrorResponse {
    pub response: Response,
}

#[cgp_new_provider]
impl<Context, MethodArg, UrlArg, Headers, Input>
    Handler<Context, SimpleHttpRequest<MethodArg, UrlArg, Headers>, Input>
    for HandleSimpleHttpRequest
where
    Context: CanHandle<CoreHttpRequest<MethodArg, UrlArg, Headers>, Input, Output = Response>
        + CanRaiseAsyncError<reqwest::Error>
        + CanRaiseAsyncError<ErrorResponse>,
    MethodArg: Send,
    UrlArg: Send,
    Headers: Send,
    Input: Send,
{
    type Output = Vec<u8>;

    async fn handle(
        context: &Context,
        _tag: PhantomData<SimpleHttpRequest<MethodArg, UrlArg, Headers>>,
        body: Input,
    ) -> Result<Vec<u8>, Context::Error> {
        let response = context.handle(PhantomData, body).await?;

        let status_code = response.status();

        if !status_code.is_success() {
            return Err(Context::raise_error(ErrorResponse { response }));
        }

        let response_body = response.bytes().await.map_err(Context::raise_error)?;

        Ok(response_body.into())
    }
}