use std::path::Path;
use super::manager::{ManagedError, SessionManager};
impl SessionManager {
pub(crate) async fn resolve_session_name(
&self,
name_hint: Option<&str>,
github_project: Option<&str>,
cwd: &Path,
extra_collision: impl Fn(&str) -> bool,
) -> Result<String, ManagedError> {
let mut existing_names = self.names_for_serial_allocation().await?;
let leaf_hint = name_hint.map(|h| crate::core::names::leaf_slug_from_dir(Path::new(h)));
const MAX_NAME_ALLOCATION_ATTEMPTS: u8 = 5;
for _ in 0..MAX_NAME_ALLOCATION_ATTEMPTS {
let candidate = if let Some(ref leaf) = leaf_hint {
crate::core::names::build_session_name(leaf, &existing_names)?
} else {
crate::core::names::build_managed_session_name(
github_project,
cwd,
&existing_names,
)?
};
if self.tmux.session_exists(&candidate) || extra_collision(&candidate) {
existing_names.push(candidate);
continue;
}
return Ok(candidate);
}
Err(ManagedError::NameCollision(format!(
"no free `tm-<leaf>-NN` name after {MAX_NAME_ALLOCATION_ATTEMPTS} attempts \
(sustained concurrent creates for the same project)"
)))
}
}