use std::sync::{Arc, OnceLock, Weak};
use tokio::sync::Mutex;
use crate::core::client::{Client, ClientError};
static DOCKER_CLIENT: OnceLock<Mutex<Weak<Client>>> = OnceLock::new();
impl Client {
pub(crate) async fn lazy_client() -> Result<Arc<Client>, ClientError> {
let mut guard = DOCKER_CLIENT
.get_or_init(|| Mutex::new(Weak::new()))
.lock()
.await;
let maybe_client = guard.upgrade();
if let Some(client) = maybe_client {
Ok(client)
} else {
let client = Arc::new(Client::new().await?);
*guard = Arc::downgrade(&client);
Ok(client)
}
}
}
pub async fn docker_client_instance() -> Result<bollard::Docker, ClientError> {
Client::lazy_client().await.map(|c| c.bollard.clone())
}