use crate::{
clients::{ClientContext, DatabaseClient},
models::{DatabaseProperties, ResourceResponse},
CreateDatabaseOptions, Query, QueryDatabasesOptions, QueryItemIterator,
};
use azure_core::http::Url;
use azure_data_cosmos_driver::models::CosmosOperation;
use serde::Serialize;
pub use super::cosmos_client_builder::CosmosClientBuilder;
#[derive(Debug, Clone)]
pub struct CosmosClient {
pub(crate) context: ClientContext,
}
impl CosmosClient {
pub fn builder() -> CosmosClientBuilder {
CosmosClientBuilder::new()
}
pub fn database_client(&self, id: &str) -> DatabaseClient {
DatabaseClient::new(self.context.clone(), id)
}
pub fn endpoint(&self) -> &Url {
self.context.driver.account().endpoint()
}
pub async fn query_databases(
&self,
query: impl Into<Query>,
options: Option<QueryDatabasesOptions>,
) -> crate::Result<QueryItemIterator<DatabaseProperties>> {
let options = options.unwrap_or_default();
let query = query.into();
let account = self.context.driver.account().clone();
let initial_operation =
CosmosOperation::query_databases(account).with_body(serde_json::to_vec(&query)?);
let operation_options = options.operation;
let plan = self
.context
.driver
.plan_operation(initial_operation, &operation_options, None)
.await?;
Ok(QueryItemIterator::new(
self.context.driver.clone(),
None,
plan,
operation_options,
))
}
#[doc = include_str!("../../docs/control-plane-warning.md")]
pub async fn create_database(
&self,
id: &str,
options: Option<CreateDatabaseOptions>,
) -> crate::Result<ResourceResponse<DatabaseProperties>> {
let options = options.unwrap_or_default();
#[derive(Serialize)]
struct RequestBody<'a> {
id: &'a str,
}
let body = serde_json::to_vec(&RequestBody { id })?;
let operation =
CosmosOperation::create_database(self.context.driver.account().clone()).with_body(body);
let mut operation_options = options.operation;
operation_options.content_response_on_write =
Some(azure_data_cosmos_driver::options::ContentResponseOnWrite::Enabled);
let driver_response = self
.context
.driver
.execute_singleton_operation(operation, operation_options)
.await?;
Ok(ResourceResponse::new(
crate::driver_bridge::driver_response_to_cosmos_response(driver_response),
))
}
}
#[cfg(test)]
mod tests {
use super::*;
#[allow(dead_code, unreachable_code, unused_variables)]
fn _assert_futures_are_send() {
fn assert_send<T: Send>(_: T) {}
let client: &CosmosClient = todo!();
assert_send(client.query_databases(Query::from("SELECT * FROM dbs"), todo!()));
assert_send(client.create_database(todo!(), todo!()));
}
}