use anyhow::{Result, anyhow, bail};
fn normalize_mac_port_name(port_name: &str) -> String {
#[cfg(target_os = "macos")]
{
if port_name.starts_with("/dev/tty.") {
return port_name.replace("/dev/tty.", "/dev/cu.");
}
}
port_name.to_string()
}
pub fn normalize_port_name(port_name: &str) -> String {
normalize_mac_port_name(port_name)
}
pub fn check_port_available(port_name: &str) -> Result<()> {
match serialport::available_ports() {
Ok(ports) => {
#[cfg(target_os = "macos")]
let filtered_ports: Vec<_> = ports
.into_iter()
.filter(|port| !port.port_name.starts_with("/dev/tty."))
.collect();
#[cfg(not(target_os = "macos"))]
let filtered_ports: Vec<_> = ports.into_iter().collect();
if filtered_ports.iter().any(|p| p.port_name == port_name) {
return Ok(());
}
let available_ports: Vec<String> =
filtered_ports.iter().map(|p| p.port_name.clone()).collect();
bail!(
"The specified port '{}' does not exist. Available ports: {}",
port_name,
if available_ports.is_empty() {
"No available ports".to_string()
} else {
available_ports.join(", ")
}
)
}
Err(e) => Err(anyhow!("Failed to get available ports list: {}", e)),
}
}