use super::lock::DistributedLock;
use crate::backend::RedisBackend;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, AtomicU32};
use std::time::Duration;
use tokio::sync::Mutex;
use uuid::Uuid;
const DEFAULT_LOCK_TTL: Duration = Duration::from_secs(30);
pub struct DistLockBuilder {
backend: Arc<RedisBackend>,
key: String,
ttl: Duration,
watchdog_enabled: bool,
}
impl DistLockBuilder {
pub fn new(backend: Arc<RedisBackend>, key: String) -> Self {
Self {
backend,
key,
ttl: DEFAULT_LOCK_TTL,
watchdog_enabled: true,
}
}
pub fn ttl(mut self, ttl: Duration) -> Self {
self.ttl = ttl;
self
}
pub fn watchdog_enabled(mut self, enabled: bool) -> Self {
self.watchdog_enabled = enabled;
self
}
pub fn build(self) -> DistributedLock {
DistributedLock {
backend: self.backend,
key: self.key,
owner_id: Uuid::new_v4().to_string(),
reentrant_count: AtomicU32::new(0),
ttl: self.ttl,
watchdog_enabled: self.watchdog_enabled,
watchdog: Mutex::new(None),
released: Arc::new(AtomicBool::new(false)),
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_builder_defaults() {
assert_eq!(DEFAULT_LOCK_TTL, Duration::from_secs(30));
}
}