use crate::FileLock;
use std::io::Result;
#[must_use = "this guard holds a file lock; if not used, the lock will be immediately released"]
pub struct FileLockGuard<'a> {
lock: &'a mut FileLock,
unlocked: bool,
}
impl<'a> FileLockGuard<'a> {
pub(crate) fn new(lock: &'a mut FileLock) -> Self {
FileLockGuard {
lock,
unlocked: false,
}
}
pub fn file(&self) -> &std::fs::File {
self.lock.file()
}
pub fn unlock(mut self) -> Result<()> {
if !self.unlocked {
self.lock.unlock()?;
self.unlocked = true;
}
Ok(())
}
}
impl Drop for FileLockGuard<'_> {
fn drop(&mut self) {
if !self.unlocked {
let _ = self.lock.unlock();
}
}
}
#[must_use = "this guard holds a file lock; if not used, the lock will be immediately released"]
pub struct OwnedFileLockGuard {
lock: Option<FileLock>,
}
impl OwnedFileLockGuard {
pub(crate) fn new(lock: FileLock) -> Self {
OwnedFileLockGuard { lock: Some(lock) }
}
pub fn file(&self) -> &std::fs::File {
self.lock.as_ref().unwrap().file()
}
pub fn unlock(mut self) -> Result<FileLock> {
let mut lock = self.lock.take().unwrap();
lock.unlock()?;
Ok(lock)
}
}
impl Drop for OwnedFileLockGuard {
fn drop(&mut self) {
if let Some(lock) = &mut self.lock {
let _ = lock.unlock();
}
}
}