oximod_core 0.1.0

The core logic and error handling for Oximod, a MongoDB ODM for Rust.
Documentation
use std::sync::{ Arc, OnceLock };
use mongodb::Client;
use crate::{ error::conn_error::MongoDbError, Printable, attach_printables };

static CLIENT: OnceLock<Arc<Client>> = OnceLock::new();

async fn init_db(mongo_uri: String) -> Result<Client, MongoDbError> {
    let client = Client::with_uri_str(&mongo_uri).await.map_err(|e|
        MongoDbError::ConnectionError(format!("{}", e))

    )?;

    Ok(client)
}

pub fn get_global_client() -> Result<Arc<Client>, MongoDbError> {
    let client = CLIENT.get()
        .cloned()
        .ok_or_else(||
            attach_printables!(
                MongoDbError::ClientNotFound("Failed to clone arc".to_string()),
                "Ensure you call `set_global_client` before using `get_global_client`."
            )

        )?;
    Ok(client)
}

pub async fn set_global_client(mongo_uri: String) -> Result<(), MongoDbError> {
    let client = init_db(mongo_uri).await?;

    CLIENT.set(client.into()).map_err(|_|
        attach_printables!(
            MongoDbError::SetClientError("CLIENT set method failed.".to_string()),
            "Ensure `set_global_client` is only called once, or restart the application."
        )

    )?;

    Ok(())
}