use crate::{AutomationError, Desktop};
pub fn normalize(s: &str) -> String {
s.chars()
.filter(|c| {
!matches!(
*c,
'\u{200B}' | '\u{200C}' | '\u{200D}' | '\u{00A0}' | '\u{FEFF}' )
})
.collect::<String>()
.to_lowercase()
}
pub fn find_pid_for_process(desktop: &Desktop, process_name: &str) -> Result<u32, AutomationError> {
use sysinfo::{ProcessesToUpdate, System};
let apps = desktop.applications()?;
let mut system = System::new();
system.refresh_processes(ProcessesToUpdate::All, true);
let process_lower = process_name.to_lowercase();
apps.iter()
.filter_map(|app| {
let app_pid = app.process_id().unwrap_or(0);
if app_pid > 0 {
system
.process(sysinfo::Pid::from_u32(app_pid))
.and_then(|p| {
let name = p.name().to_string_lossy().to_string();
if name.to_lowercase().contains(&process_lower) {
Some(app_pid)
} else {
None
}
})
} else {
None
}
})
.next()
.ok_or_else(|| {
AutomationError::ElementNotFound(format!(
"Process '{}' not found. Use open_application() to start it first.",
process_name
))
})
}