various-rust-utils 0.1.3

Some helpers for rust projects
Documentation
use crate::api_clients::errors::{extract_error_message, ApiCallError};

pub async fn execute_graphql_request<Req: serde::Serialize, Res: serde::de::DeserializeOwned>(
    url: String,
    token: &str,
    request_body: Req,
) -> Result<Res, ApiCallError> {
    let client = reqwest::Client::new();
    let response = client
        .post(url)
        .header("Authorization", format!("Bearer {}", token))
        .json(&request_body)
        .send()
        .await;
    match response {
        Ok(response) => map_response(response.json().await),
        Err(error) => Err(ApiCallError::RequestFailed(error.to_string())),
    }
}

fn map_response<Res: serde::de::DeserializeOwned>(
    response: reqwest::Result<graphql_client::Response<Res>>,
) -> Result<Res, ApiCallError> {
    match response {
        Ok(response) => match response.data {
            None => Err(ApiCallError::DataError(extract_error_message(
                response.errors,
            ))),
            Some(response) => Ok(response),
        },
        Err(error) => Err(ApiCallError::JsonParse(error.to_string())),
    }
}