distributed_lock_file/
provider.rs1use std::path::{Path, PathBuf};
4
5use distributed_lock_core::error::{LockError, LockResult};
6use distributed_lock_core::traits::LockProvider;
7
8use crate::lock::FileDistributedLock;
9
10pub struct FileLockProviderBuilder {
12 directory: Option<PathBuf>,
13}
14
15impl FileLockProviderBuilder {
16 pub fn new() -> Self {
18 Self { directory: None }
19 }
20
21 pub fn directory(mut self, path: impl Into<PathBuf>) -> Self {
25 self.directory = Some(path.into());
26 self
27 }
28
29 pub fn build(self) -> LockResult<FileLockProvider> {
36 let directory = self
37 .directory
38 .ok_or_else(|| LockError::InvalidName("directory not specified".to_string()))?;
39
40 std::fs::create_dir_all(&directory)
42 .map_err(|e| LockError::InvalidName(format!("failed to create directory: {e}")))?;
43
44 Ok(FileLockProvider { directory })
45 }
46}
47
48impl Default for FileLockProviderBuilder {
49 fn default() -> Self {
50 Self::new()
51 }
52}
53
54pub struct FileLockProvider {
59 directory: PathBuf,
60}
61
62impl FileLockProvider {
63 pub fn builder() -> FileLockProviderBuilder {
65 FileLockProviderBuilder::new()
66 }
67
68 pub fn new(directory: impl Into<PathBuf>) -> LockResult<Self> {
72 Self::builder().directory(directory).build()
73 }
74
75 pub fn directory(&self) -> &Path {
77 &self.directory
78 }
79}
80
81impl LockProvider for FileLockProvider {
82 type Lock = FileDistributedLock;
83
84 fn create_lock(&self, name: &str) -> Self::Lock {
85 FileDistributedLock::new(&self.directory, name)
86 .expect("failed to create lock from provider")
87 }
88}