hypershell-reqwest-components 0.1.0-alpha

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

use cgp::extra::handler::{Handler, HandlerComponent};
use cgp::prelude::*;
use hypershell_components::components::{CanExtractMethodArg, CanExtractUrlArg};
use reqwest::{Body, Method, Response, Url};

use crate::components::{CanUpdateRequestBuilder, HasReqwestClient};
use crate::dsl::CoreHttpRequest;

#[cgp_new_provider]
impl<Context, MethodArg, UrlArg, Headers, Input>
    Handler<Context, CoreHttpRequest<MethodArg, UrlArg, Headers>, Input> for HandleCoreHttpRequest
where
    Context: HasReqwestClient
        + CanExtractUrlArg<UrlArg, Url = Url>
        + CanExtractMethodArg<MethodArg, HttpMethod = Method>
        + CanUpdateRequestBuilder<Headers>
        + CanRaiseAsyncError<reqwest::Error>,
    MethodArg: Send,
    UrlArg: Send,
    Headers: Send,
    Input: Send + Into<Body>,
{
    type Output = Response;

    async fn handle(
        context: &Context,
        _tag: PhantomData<CoreHttpRequest<MethodArg, UrlArg, Headers>>,
        body: Input,
    ) -> Result<Response, Context::Error> {
        let client = context.request_client();
        let url = context.extract_url_arg(PhantomData)?;
        let method = context.extract_method_arg(PhantomData);

        let builder = client.request(method, url);

        let builder = context
            .update_request_builder(PhantomData, builder)?
            .body(body);

        let response = builder.send().await.map_err(Context::raise_error)?;

        Ok(response)
    }
}