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