1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
use google_cloud_gax::conn::{Channel, ConnectionManager, Error};

use google_cloud_longrunning::autogen::operations_client::OperationsClient;

use crate::admin::database::database_admin_client::DatabaseAdminClient;
use crate::admin::instance::instance_admin_client::InstanceAdminClient;
use crate::admin::AdminClientConfig;
use crate::apiv1::conn_pool::{AUDIENCE, SPANNER};

#[derive(Clone)]
pub struct Client {
    database: DatabaseAdminClient,
    instance: InstanceAdminClient,
}

impl Client {
    pub async fn new(config: AdminClientConfig) -> Result<Self, Error> {
        let (conn, lro_client) = internal_client(&config).await?;
        let database = DatabaseAdminClient::new(conn, lro_client);

        let (conn, lro_client) = internal_client(&config).await?;
        let instance = InstanceAdminClient::new(conn, lro_client);
        Ok(Self { database, instance })
    }

    pub fn database(&self) -> &DatabaseAdminClient {
        &self.database
    }

    pub fn instance(&self) -> &InstanceAdminClient {
        &self.instance
    }
}

async fn internal_client(config: &AdminClientConfig) -> Result<(Channel, OperationsClient), Error> {
    let conn_pool = ConnectionManager::new(1, SPANNER, AUDIENCE, &config.environment).await?;
    let conn = conn_pool.conn();
    let lro_client = OperationsClient::new(conn).await?;
    Ok((conn_pool.conn(), lro_client))
}