use std::fs;
use std::io;
use std::path::{Path, PathBuf};
use super::{CLAIMED_DIR, EXT, gestures_dir, list};
pub fn claimed(state_root: &Path) -> Vec<(String, PathBuf)> {
list(&gestures_dir(state_root).join(CLAIMED_DIR))
}
#[derive(Debug)]
pub struct Claim {
path: PathBuf,
_lock: fs::File,
}
impl Claim {
pub fn path(&self) -> PathBuf {
self.path.clone()
}
}
pub fn claim(state_root: &Path, id: &str) -> io::Result<Claim> {
let dir = gestures_dir(state_root);
let claimed_dir = dir.join(CLAIMED_DIR);
fs::create_dir_all(&claimed_dir)?;
let from = dir.join(format!("{id}{EXT}"));
let file = fs::File::open(&from)?;
if file.try_lock().is_err() {
return Err(io::Error::new(
io::ErrorKind::WouldBlock,
format!("gesture {id:?} is already claimed"),
));
}
let to = claimed_dir.join(format!("{id}{EXT}"));
fs::rename(&from, &to)?;
Ok(Claim {
path: to,
_lock: file,
})
}
pub fn unheld(path: &Path) -> bool {
fs::File::open(path).is_ok_and(|f| f.try_lock().is_ok())
}