use std::fs::{self, File};
use std::path::PathBuf;
use fs4::FileExt;
use crate::error::{Error, Result};
fn lock_path() -> PathBuf {
dirs::runtime_dir().unwrap_or_else(std::env::temp_dir).join("agentgear.lock")
}
pub(crate) struct LockGuard {
file: File,
}
impl Drop for LockGuard {
fn drop(&mut self) {
let _ = FileExt::unlock(&self.file);
}
}
pub(crate) fn acquire() -> Result<LockGuard> {
let path = lock_path();
if let Some(parent) = path.parent() {
let _ = fs::create_dir_all(parent);
}
let file = File::create(&path).map_err(|source| Error::Lock { path: path.clone(), source })?;
FileExt::lock(&file).map_err(|source| Error::Lock { path, source })?;
Ok(LockGuard { file })
}