use crate::{
clients::{ClientContext, DatabaseClient},
models::{DatabaseProperties, ResourceResponse},
CreateDatabaseOptions, FeedItemIterator, Query, QueryDatabasesOptions,
};
use azure_core::http::Url;
use azure_data_cosmos_driver::models::CosmosOperation;
use azure_data_cosmos_driver::options::OperationOptions;
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.pipeline.endpoint
}
pub fn query_databases(
&self,
query: impl Into<Query>,
_options: Option<QueryDatabasesOptions>,
) -> azure_core::Result<FeedItemIterator<DatabaseProperties>> {
let account = self.context.driver.account().clone();
let factory = move || CosmosOperation::query_databases(account.clone());
crate::query::executor::QueryExecutor::new(
self.context.driver.clone(),
factory,
query.into(),
Default::default(),
None,
)
.into_stream()
}
#[doc = include_str!("../../docs/control-plane-warning.md")]
pub async fn create_database(
&self,
id: &str,
#[allow(unused_variables, reason = "This parameter may be used in the future")]
options: Option<CreateDatabaseOptions>,
) -> azure_core::Result<ResourceResponse<DatabaseProperties>> {
#[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 = OperationOptions::default();
operation_options.content_response_on_write =
Some(azure_data_cosmos_driver::options::ContentResponseOnWrite::Enabled);
let driver_response = self
.context
.driver
.execute_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.create_database(todo!(), todo!()));
}
}