dagger_core/
graphql_client.rs

1use std::collections::HashMap;
2use std::sync::Arc;
3
4use async_trait::async_trait;
5use base64::engine::general_purpose;
6use base64::Engine;
7
8use crate::connect_params::ConnectParams;
9use crate::gql_client::{ClientConfig, GQLClient};
10
11#[async_trait]
12pub trait GraphQLClient {
13    async fn query(&self, query: &str) -> eyre::Result<Option<serde_json::Value>>;
14}
15
16pub type DynGraphQLClient = Arc<dyn GraphQLClient + Send + Sync>;
17
18#[derive(Debug)]
19pub struct DefaultGraphQLClient {
20    client: GQLClient,
21}
22
23impl DefaultGraphQLClient {
24    pub fn new(conn: &ConnectParams) -> Self {
25        let token = general_purpose::URL_SAFE.encode(format!("{}:", conn.session_token));
26
27        let mut headers = HashMap::new();
28        headers.insert("Authorization".to_string(), format!("Basic {}", token));
29
30        Self {
31            client: GQLClient::new_with_config(ClientConfig {
32                endpoint: conn.url(),
33                timeout: Some(1000),
34                headers: Some(headers),
35                proxy: None,
36            }),
37        }
38    }
39}
40
41#[async_trait]
42impl GraphQLClient for DefaultGraphQLClient {
43    async fn query(&self, query: &str) -> eyre::Result<Option<serde_json::Value>> {
44        let res: Option<serde_json::Value> = self
45            .client
46            .query(&query)
47            .await
48            .map_err(|r| eyre::anyhow!(r.to_string()))?;
49
50        return Ok(res);
51    }
52}