monsta-client 0.0.1

Monsta client
Documentation
use monsta_proto::*;

use crate::{client::Client, metadata, Database, Error, Result};

pub struct Universe {
    client: Client,
}

impl Universe {
    pub async fn connect(url: String) -> Result<Self> {
        let client = Client::connect(url).await?;
        Ok(Self { client })
    }

    pub async fn create_database(
        &self,
        spec: impl Into<metadata::DatabaseSpec>,
    ) -> Result<Database> {
        let req = DatabaseRequest {
            create_database: Some(CreateDatabaseRequest {
                spec: Some(spec.into().into()),
            }),
            ..Default::default()
        };
        let res = self.client.database_call(req).await?;
        let desc = res
            .create_database
            .and_then(|x| x.desc)
            .ok_or_else(|| Error::InvalidResponse)?;
        Ok(Database::new(self.client.clone(), desc.id))
    }

    pub async fn lookup_database(&self, name: impl Into<String>) -> Result<Database> {
        let desc = self.describe_database(name).await?;
        Ok(Database::new(self.client.clone(), desc.id))
    }

    pub async fn describe_database(&self, name: impl Into<String>) -> Result<DatabaseDesc> {
        let req = DatabaseRequest {
            describe_database: Some(DescribeDatabaseRequest {
                name: name.into(),
                ..Default::default()
            }),
            ..Default::default()
        };
        let res = self.client.database_call(req).await?;
        let desc = res
            .describe_database
            .and_then(|x| x.desc)
            .ok_or_else(|| Error::InvalidResponse)?;
        Ok(desc)
    }
}