use crate::tina::data::AppResult;
use std::future::Future;
use std::time::Duration;
#[cfg(feature = "redis")]
pub type DistributedLockService = crate::tina::redis::lock::RedisDistributedLock;
#[cfg(not(feature = "redis"))]
pub type DistributedLockService = NoDistributedLockService;
#[crate::async_trait]
pub trait IDistributedLockService: Send + Sync + 'static {
async fn lock<Lock, F, R>(
&mut self,
key: &str,
value: Option<Lock>,
lock_timeout: Duration,
retry_interval: Duration,
fut: F,
) -> AppResult<R>
where
Lock: ToString + Send + 'static,
F: Future<Output = AppResult<R>> + Send + 'static,
R: Send + 'static;
}
#[derive(Debug)]
pub struct NoDistributedLockService;
#[allow(unused_variables)]
#[crate::async_trait]
impl IDistributedLockService for NoDistributedLockService {
async fn lock<Lock, F, R>(
&mut self,
key: &str,
value: Option<Lock>,
lock_timeout: Duration,
retry_interval: Duration,
fut: F,
) -> AppResult<R>
where
Lock: ToString + Send + 'static,
F: Future<Output = AppResult<R>> + Send + 'static,
R: Send + 'static,
{
unimplemented!()
}
}