shuttle_provisioner_proto_test/
lib.rs

1use tonic::{
2    transport::{Channel, Endpoint, Error as TransportError},
3    Request, Status,
4};
5
6mod proto {
7    use serde::Serialize;
8
9    tonic::include_proto!("provisioner");
10}
11
12pub use proto::DatabaseResponse;
13use proto::{
14    aws_rds::Engine as RdsEngine, database_request::DbType, provisioner_client::ProvisionerClient,
15    shared::Engine as SharedEngine, AwsRds, DatabaseRequest, RdsConfig, Shared,
16};
17
18pub struct Provisioner(ProvisionerClient<Channel>);
19
20impl Provisioner {
21    pub async fn connect<S>(address: S) -> Result<Self, TransportError>
22    where
23        S: Into<String>,
24    {
25        let endpoint = Endpoint::try_from(address.into())?;
26        let inner = ProvisionerClient::connect(endpoint).await?;
27
28        Ok(Provisioner(inner))
29    }
30
31    pub async fn database(
32        &mut self,
33        project: &str,
34        kind: &str,
35        engine: &str,
36    ) -> Result<DatabaseResponse, Status> {
37        let request = Request::new(DatabaseRequest {
38            project_name: project.to_owned(),
39            db_type: Some(parse_database_type(kind, engine)),
40        });
41
42        self.0
43            .provision_database(request)
44            .await
45            .map(|resp| resp.into_inner())
46    }
47}
48
49fn parse_database_type(kind: &str, engine: &str) -> DbType {
50    match (kind, engine) {
51        ("shared", "postgres") => DbType::Shared(Shared {
52            engine: Some(SharedEngine::Postgres(String::new())),
53        }),
54        ("shared", "mongodb") => DbType::Shared(Shared {
55            engine: Some(SharedEngine::Mongodb(String::new())),
56        }),
57        ("aws", "postgres") => DbType::AwsRds(AwsRds {
58            engine: Some(RdsEngine::Postgres(RdsConfig {})),
59        }),
60        ("aws", "mysql") => DbType::AwsRds(AwsRds {
61            engine: Some(RdsEngine::Mysql(RdsConfig {})),
62        }),
63        ("aws", "mariadb") => DbType::AwsRds(AwsRds {
64            engine: Some(RdsEngine::Mariadb(RdsConfig {})),
65        }),
66        _ => unreachable!(),
67    }
68}