use std::path::Path;
use crate::error::Result;
pub fn next_task_id(task_dir: &Path) -> Result<String> {
std::fs::create_dir_all(task_dir)?;
let max_id = std::fs::read_dir(task_dir)?
.filter_map(|entry| entry.ok())
.filter_map(|entry| {
let name = entry.file_name();
let name = name.to_str()?;
let stem = name.strip_suffix(".json")?;
stem.parse::<u64>().ok()
})
.max()
.unwrap_or(0);
Ok((max_id + 1).to_string())
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn next_id_empty_dir() {
let dir = tempfile::tempdir().unwrap();
let id = next_task_id(dir.path()).unwrap();
assert_eq!(id, "1");
}
#[test]
fn next_id_with_existing() {
let dir = tempfile::tempdir().unwrap();
std::fs::write(dir.path().join("1.json"), "{}").unwrap();
std::fs::write(dir.path().join("5.json"), "{}").unwrap();
std::fs::write(dir.path().join("3.json"), "{}").unwrap();
std::fs::write(dir.path().join("config.json"), "{}").unwrap();
std::fs::write(dir.path().join(".id.lock"), "").unwrap();
let id = next_task_id(dir.path()).unwrap();
assert_eq!(id, "6");
}
}