clientix-core 0.2.0

Library for building HTTP clients and requests declaratively with procedural macros - no need to write complex imperative or functional logic.
Documentation
use bytes::Bytes;
use futures_util::TryStreamExt;
use reqwest::Response;
use serde::de::DeserializeOwned;
use crate::client::asynchronous::stream::ClientixStream;
use crate::client::asynchronous::stream::sse::ClientixSSEStream;
use crate::client::response::{ClientixError, ClientixResponse, ClientixResult};

pub struct AsyncResponseHandler {
    result: ClientixResult<Response>
}

impl AsyncResponseHandler {

    pub fn new(result: ClientixResult<Response>) -> AsyncResponseHandler {
        AsyncResponseHandler { result }
    }

    pub async fn bytes(self) -> ClientixResult<ClientixResponse<Bytes>> {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    response.bytes().await?
                ))
            },
            Err(error) => Err(error),
        }
    }

    pub fn bytes_stream(self) -> ClientixResult<ClientixStream> {
        match self.result {
            Ok(response) => {
                Ok(ClientixStream::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    response.bytes_stream().map_err(ClientixError::from)
                ))
            },
            Err(error) => Err(error)
        }
    }

    pub async fn text(self) -> ClientixResult<ClientixResponse<String>> {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    response.text().await?
                ))
            },
            Err(error) => Err(error),
        }
    }

    pub async fn text_with_encoding(self, encoding: &str) -> ClientixResult<ClientixResponse<String>> {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    response.text_with_charset(encoding).await?
                ))
            },
            Err(error) => Err(error),
        }
    }

    pub fn text_stream(self) -> ClientixResult<ClientixSSEStream<String>> {
        Ok(self.bytes_stream()?.sse())
    }

    pub async fn json<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    serde_json::from_str::<T>(response.text().await?.as_str())?
                ))
            },
            Err(error) => Err(error),
        }
    }

    pub fn json_stream<T>(self) -> ClientixResult<ClientixSSEStream<T>> where T: DeserializeOwned + Clone {
        Ok(self.text_stream()?.json_stream())
    }

    pub async fn xml<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    serde_xml_rs::from_str::<T>(response.text().await?.as_str())?
                ))
            },
            Err(error) => Err(error),
        }
    }
    
    pub async fn xml_stream<T>(self) -> ClientixResult<ClientixSSEStream<T>> where T: DeserializeOwned + Clone {
        Ok(self.text_stream()?.xml_stream())
    }
    
    pub async fn urlencoded<T>(self) -> ClientixResult<ClientixResponse<T>> where T: DeserializeOwned + Clone {
        match self.result {
            Ok(response) => {
                Ok(ClientixResponse::new(
                    response.version(),
                    response.content_length(),
                    response.status(),
                    response.url().clone(),
                    response.remote_addr(),
                    response.headers().clone(),
                    serde_urlencoded::from_str::<T>(response.text().await?.as_str())?
                ))
            },
            Err(error) => Err(error),
        }
    }
    
}