use std::fs::{File, OpenOptions, TryLockError};
use std::io;
use std::path::Path;
#[derive(Debug)]
pub(crate) struct OsLock {
file: File,
}
impl OsLock {
pub(crate) fn open(path: &Path) -> io::Result<Self> {
let file = OpenOptions::new()
.write(true)
.create(true)
.truncate(false)
.open(path)?;
Ok(OsLock { file })
}
pub(crate) fn lock(&self) -> io::Result<()> {
self.file.lock()
}
pub(crate) fn try_lock(&self) -> io::Result<()> {
self.file.try_lock().map_err(|e| match e {
TryLockError::WouldBlock => io::Error::from(io::ErrorKind::WouldBlock),
TryLockError::Error(e) => e,
})
}
pub(crate) fn unlock(&self) -> io::Result<()> {
self.file.unlock()
}
}