use crate::{Error, Result};
pub(crate) fn parse_range_list_with<F: FnMut(usize)>(range_str: &str, mut sink: F) -> Result<()> {
for part in range_str.trim().split(',') {
let part = part.trim();
if part.is_empty() {
continue;
}
if part.contains('-') {
let mut iter = part.splitn(2, '-');
let start_str = iter
.next()
.ok_or_else(|| Error::Detection(format!("Invalid CPU range format: {}", part)))?;
let end_str = iter
.next()
.ok_or_else(|| Error::Detection(format!("Invalid CPU range format: {}", part)))?;
let start = start_str
.parse::<usize>()
.map_err(|_| Error::Detection(format!("Invalid CPU range start: {}", start_str)))?;
let end = end_str
.parse::<usize>()
.map_err(|_| Error::Detection(format!("Invalid CPU range end: {}", end_str)))?;
if start > end {
return Err(Error::Detection(format!(
"Invalid CPU range order: {}-{}",
start, end
)));
}
for id in start..=end {
sink(id);
}
} else {
let cpu_id = part
.parse::<usize>()
.map_err(|_| Error::Detection(format!("Invalid CPU ID in range list: {}", part)))?;
sink(cpu_id);
}
}
Ok(())
}
pub(crate) fn parse_range_list_str(range_str: &str) -> Result<Vec<usize>> {
let mut cpus = Vec::new();
parse_range_list_with(range_str, |id| cpus.push(id))?;
Ok(cpus)
}