use crate::{IdWorker, IdWorkerConfig, IdWorkerError, IdWorkerGenerator};
use tracing::debug;
use std::sync::{Arc, RwLock};
static ID_WORKER: RwLock<Option<Arc<dyn IdWorker>>> = RwLock::new(None);
pub fn get_id_worker() -> Result<Arc<dyn IdWorker>, IdWorkerError> {
let read_lock = ID_WORKER.read().map_err(|_| IdWorkerError::GetIdWorker())?;
read_lock
.as_ref()
.map(Arc::clone)
.ok_or(IdWorkerError::GetIdWorker())
}
pub fn set_id_worker(value: Arc<dyn IdWorker>) -> Result<(), IdWorkerError> {
let mut write_lock = ID_WORKER
.write()
.map_err(|_| IdWorkerError::SetIdWorker())?;
*write_lock = Some(value);
Ok(())
}
pub fn init_id_worker(id_worker_config: IdWorkerConfig) -> Result<(), IdWorkerError> {
debug!("init id worker...");
let id_worker = IdWorkerGenerator::generate(id_worker_config)?;
set_id_worker(id_worker)
}