pub(crate) fn split_rows(content: &str, separator: Option<char>) -> Vec<Vec<&str>> {
content
.lines()
.filter(|line| {
let trimmed = line.trim();
!trimmed.is_empty() && !trimmed.starts_with('#')
})
.map(|line| match separator {
Some(sep) => line.split(sep).map(str::trim).collect(),
None => line.split_whitespace().collect(),
})
.collect()
}
#[cfg(test)]
#[allow(clippy::unwrap_used, clippy::expect_used)]
mod tests {
use super::*;
#[test]
fn blank_and_comment_lines_are_skipped() {
let rows = split_rows("# header\n\n1,2\n\n \n3,4\n", Some(','));
assert_eq!(rows, vec![vec!["1", "2"], vec!["3", "4"]]);
}
#[test]
fn fields_are_trimmed_when_splitting_on_a_separator() {
let rows = split_rows(" 1 , 2 ,3 \n", Some(','));
assert_eq!(rows, vec![vec!["1", "2", "3"]]);
}
#[test]
fn whitespace_splitting_collapses_runs() {
let rows = split_rows("1 2\t3\n", None);
assert_eq!(rows, vec![vec!["1", "2", "3"]]);
}
#[test]
fn a_hash_after_the_first_column_is_not_a_comment() {
let rows = split_rows("1,2#3\n", Some(','));
assert_eq!(rows, vec![vec!["1", "2#3"]]);
}
#[test]
fn rows_borrow_from_the_input() {
let content = String::from("1,2,3\n");
let rows = split_rows(&content, Some(','));
assert_eq!(rows[0][0].as_ptr(), content.as_ptr());
}
}