various_rust_utils/api_clients/
graphql_client.rs

1use crate::api_clients::errors::{extract_error_message, ApiCallError};
2
3pub async fn execute_graphql_request<Req: serde::Serialize, Res: serde::de::DeserializeOwned>(
4    url: String,
5    token: &str,
6    request_body: Req,
7) -> Result<Res, ApiCallError> {
8    let client = reqwest::Client::new();
9    let response = client
10        .post(url)
11        .header("Authorization", format!("Bearer {}", token))
12        .json(&request_body)
13        .send()
14        .await;
15    match response {
16        Ok(response) => map_response(response.json().await),
17        Err(error) => Err(ApiCallError::RequestFailed(error.to_string())),
18    }
19}
20
21fn map_response<Res: serde::de::DeserializeOwned>(
22    response: reqwest::Result<graphql_client::Response<Res>>,
23) -> Result<Res, ApiCallError> {
24    match response {
25        Ok(response) => match response.data {
26            None => Err(ApiCallError::DataError(extract_error_message(
27                response.errors,
28            ))),
29            Some(response) => Ok(response),
30        },
31        Err(error) => Err(ApiCallError::JsonParse(error.to_string())),
32    }
33}