use std::fs::{File, OpenOptions, TryLockError};
use std::io;
use std::path::Path;
#[derive(Debug)]
pub struct ProcessLock(File);
impl ProcessLock {
pub fn try_acquire(path: impl AsRef<Path>) -> io::Result<Option<Self>> {
let file = OpenOptions::new()
.read(true)
.write(true)
.create(true)
.truncate(false)
.open(path)?;
match file.try_lock() {
Ok(()) => Ok(Some(Self(file))),
Err(TryLockError::WouldBlock) => Ok(None),
Err(TryLockError::Error(error)) => Err(error),
}
}
}
impl Drop for ProcessLock {
fn drop(&mut self) {
let _ = self.0.unlock();
}
}