monsta_client/
universe.rs

1use monsta_proto::*;
2
3use crate::{client::Client, metadata, Database, Error, Result};
4
5pub struct Universe {
6    client: Client,
7}
8
9impl Universe {
10    pub async fn connect(url: String) -> Result<Self> {
11        let client = Client::connect(url).await?;
12        Ok(Self { client })
13    }
14
15    pub async fn create_database(
16        &self,
17        spec: impl Into<metadata::DatabaseSpec>,
18    ) -> Result<Database> {
19        let req = DatabaseRequest {
20            create_database: Some(CreateDatabaseRequest {
21                spec: Some(spec.into().into()),
22            }),
23            ..Default::default()
24        };
25        let res = self.client.database_call(req).await?;
26        let desc = res
27            .create_database
28            .and_then(|x| x.desc)
29            .ok_or_else(|| Error::InvalidResponse)?;
30        Ok(Database::new(self.client.clone(), desc.id))
31    }
32
33    pub async fn lookup_database(&self, name: impl Into<String>) -> Result<Database> {
34        let desc = self.describe_database(name).await?;
35        Ok(Database::new(self.client.clone(), desc.id))
36    }
37
38    pub async fn describe_database(&self, name: impl Into<String>) -> Result<DatabaseDesc> {
39        let req = DatabaseRequest {
40            describe_database: Some(DescribeDatabaseRequest {
41                name: name.into(),
42                ..Default::default()
43            }),
44            ..Default::default()
45        };
46        let res = self.client.database_call(req).await?;
47        let desc = res
48            .describe_database
49            .and_then(|x| x.desc)
50            .ok_or_else(|| Error::InvalidResponse)?;
51        Ok(desc)
52    }
53}