pub mod session;
use super::{ChangeStream, ClientSession, Database, SessionChangeStream};
use crate::{
bson::Document,
change_stream::{event::ChangeStreamEvent, options::ChangeStreamOptions},
concern::{ReadConcern, WriteConcern},
error::Result,
options::{
ClientOptions,
DatabaseOptions,
ListDatabasesOptions,
SelectionCriteria,
SessionOptions,
},
results::DatabaseSpecification,
runtime,
Client as AsyncClient,
};
#[derive(Clone, Debug)]
pub struct Client {
async_client: AsyncClient,
}
impl From<AsyncClient> for Client {
fn from(async_client: AsyncClient) -> Self {
Self { async_client }
}
}
impl Client {
pub fn with_uri_str(uri: impl AsRef<str>) -> Result<Self> {
let async_client = runtime::block_on(AsyncClient::with_uri_str(uri.as_ref()))?;
Ok(Self { async_client })
}
pub fn with_options(options: ClientOptions) -> Result<Self> {
let async_client = AsyncClient::with_options(options)?;
Ok(Self { async_client })
}
pub fn selection_criteria(&self) -> Option<&SelectionCriteria> {
self.async_client.selection_criteria()
}
pub fn read_concern(&self) -> Option<&ReadConcern> {
self.async_client.read_concern()
}
pub fn write_concern(&self) -> Option<&WriteConcern> {
self.async_client.write_concern()
}
pub fn database(&self, name: &str) -> Database {
Database::new(self.async_client.database(name))
}
pub fn database_with_options(&self, name: &str, options: DatabaseOptions) -> Database {
Database::new(self.async_client.database_with_options(name, options))
}
pub fn default_database(&self) -> Option<Database> {
self.async_client.default_database().map(Database::new)
}
pub fn list_databases(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<ListDatabasesOptions>>,
) -> Result<Vec<DatabaseSpecification>> {
runtime::block_on(
self.async_client
.list_databases(filter.into(), options.into()),
)
}
pub fn list_database_names(
&self,
filter: impl Into<Option<Document>>,
options: impl Into<Option<ListDatabasesOptions>>,
) -> Result<Vec<String>> {
runtime::block_on(
self.async_client
.list_database_names(filter.into(), options.into()),
)
}
pub fn start_session(&self, options: Option<SessionOptions>) -> Result<ClientSession> {
runtime::block_on(self.async_client.start_session(options)).map(Into::into)
}
pub fn watch(
&self,
pipeline: impl IntoIterator<Item = Document>,
options: impl Into<Option<ChangeStreamOptions>>,
) -> Result<ChangeStream<ChangeStreamEvent<Document>>> {
runtime::block_on(self.async_client.watch(pipeline, options)).map(ChangeStream::new)
}
pub fn watch_with_session(
&self,
pipeline: impl IntoIterator<Item = Document>,
options: impl Into<Option<ChangeStreamOptions>>,
session: &mut ClientSession,
) -> Result<SessionChangeStream<ChangeStreamEvent<Document>>> {
runtime::block_on(self.async_client.watch_with_session(
pipeline,
options,
&mut session.async_client_session,
))
.map(SessionChangeStream::new)
}
}