use std::path::Path;
#[must_use]
pub fn extract_agent_name_from_logfile(log_file: &Path, log_prefix: &Path) -> Option<String> {
let filename = log_file.file_name()?.to_str()?;
let prefix_filename = log_prefix.file_name()?.to_str()?;
if !filename.starts_with(prefix_filename) {
return None;
}
let after_prefix = &filename[prefix_filename.len()..];
let after_prefix = after_prefix.strip_prefix('_')?;
let without_ext = after_prefix.strip_suffix(".log")?;
let without_ext = without_ext.rfind("_a").map_or(without_ext, |attempt_pos| {
let attempt_digits = &without_ext[attempt_pos + 2..];
if !attempt_digits.is_empty() && attempt_digits.chars().all(|c| c.is_ascii_digit()) {
let before_attempt = &without_ext[..attempt_pos];
before_attempt.rfind('_').map_or(without_ext, |model_pos| {
let model_digits = &before_attempt[model_pos + 1..];
if !model_digits.is_empty() && model_digits.chars().all(|c| c.is_ascii_digit()) {
before_attempt
} else {
without_ext
}
})
} else {
without_ext
}
});
if let Some(last_underscore) = without_ext.rfind('_') {
let after_underscore = &without_ext[last_underscore + 1..];
if after_underscore.chars().all(|c| c.is_ascii_digit()) {
return Some(without_ext[..last_underscore].to_string());
}
}
Some(without_ext.to_string())
}