#![allow(clippy::needless_lifetimes)]
mod data;
mod envs;
mod util;
use std::path::PathBuf;
use anyhow::bail;
use crate::data::DataDir;
use crate::envs::FM_PORTALLOC_DATA_DIR_ENV;
pub fn port_alloc(range_size: u16) -> anyhow::Result<u16> {
if range_size == 0 {
bail!("Can't allocate range of 0 ports");
}
let mut data_dir = DataDir::new(data_dir()?)?;
data_dir.with_lock(|data_dir| {
let mut data = data_dir.load_data()?;
let base_port = data.get_free_port_range(range_size);
data_dir.store_data(&data)?;
Ok(base_port)
})
}
fn data_dir() -> anyhow::Result<PathBuf> {
if let Some(env) = std::env::var_os(FM_PORTALLOC_DATA_DIR_ENV) {
Ok(PathBuf::from(env))
} else if let Some(dir) = dirs::cache_dir() {
Ok(dir.join("fm-portalloc"))
} else {
bail!("Could not determine port alloc data dir. Try setting FM_PORTALLOC_DATA_DIR");
}
}