mongor 0.1.10

Ergonomic MongoDB ODM
Documentation
// Authors: Robert Lopez
// License: MIT (See `LICENSE.md`)

use crate::error::Error;
use mongodb::{
    options::{SessionOptions, TransactionOptions},
    Client, ClientSession,
};

/// Starts a new `ClientSession`.
///
/// https://www.mongodb.com/docs/manual/reference/method/Session/
///
/// ---
/// Example Usage:
/// ```
///
/// let client: Client = ...;
///
/// let mut session: ClientSession = start_session(
///     &client,
///     None::<SessionOptions>,
/// ).await?;
/// ```
pub async fn start_session(
    client: &Client,
    options: Option<SessionOptions>,
) -> Result<ClientSession, Error> {
    client
        .start_session()
        .with_options(options)
        .await
        .map_err(Error::Mongo)
}

/// Starts a new transaction on a `ClientSession`.
///
/// https://www.mongodb.com/docs/manual/reference/method/Session.startTransaction/
///
/// ---
/// Example Usage:
/// ```
///
/// let client: Client = ...;
///
/// let mut session: ClientSession = start_session(
///     &client,
///     None::<SessionOptions>,
/// ).await?;
///
/// start_transaction(&mut session, None).await?;
/// ```
pub async fn start_transaction(
    session: &mut ClientSession,
    options: Option<TransactionOptions>,
) -> Result<(), Error> {
    let options = options.unwrap_or_default();

    session
        .start_transaction()
        .with_options(options)
        .await
        .map_err(Error::Mongo)
}

/// Aborts the current transaction to a `ClientSession`.
///
/// https://www.mongodb.com/docs/manual/reference/method/Session.abortTransaction/
///
/// ---
/// Example Usage:
/// ```
///
/// let client: Client = ...;
///
/// let mut session: ClientSession = start_session(
///     &client,
///     None::<SessionOptions>,
/// ).await?;
///
/// start_transaction(&mut session, None).await?;
///
/// ...
///
/// abort_transaction(&mut session).await?;
/// ```
pub async fn abort_transaction(session: &mut ClientSession) -> Result<(), Error> {
    session
        .abort_transaction()
        .await
        .map_err(Error::Mongo)
}

/// Commits the current transaction to a `ClientSession`.
///
/// https://www.mongodb.com/docs/manual/reference/method/Session.commitTransaction/
///
/// ---
/// Example Usage:
/// ```
///
/// let client: Client = ...;
///
/// let mut session: ClientSession = start_session(
///     &client,
///     None::<SessionOptions>,
/// ).await?;
///
/// start_transaction(&mut session, None).await?;
///
/// ...
///
/// commit_transaction(&mut session).await?;
/// ```
pub async fn commit_transaction(session: &mut ClientSession) -> Result<(), Error> {
    session
        .commit_transaction()
        .await
        .map_err(Error::Mongo)
}