various_rust_utils/api_clients/
graphql_client.rs1use 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}