shuttle_provisioner_proto_test/
lib.rs1use 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}