pub fn chunk_document(title: &str, body: &str) -> Vec<String> {
let paragraphs: Vec<&str> = body
.split("\n\n")
.map(str::trim)
.filter(|s| !s.is_empty())
.collect();
if paragraphs.is_empty() {
return vec![title.to_owned()];
}
paragraphs
.iter()
.map(|p| {
if title.is_empty() {
p.to_string()
} else {
format!("{title}\n\n{p}")
}
})
.collect()
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn two_paragraphs() {
let chunks = chunk_document("Title", "First.\n\nSecond.");
assert_eq!(chunks.len(), 2);
assert_eq!(chunks[0], "Title\n\nFirst.");
assert_eq!(chunks[1], "Title\n\nSecond.");
}
#[test]
fn empty_body_returns_title() {
let chunks = chunk_document("Title", "");
assert_eq!(chunks, vec!["Title"]);
}
#[test]
fn blank_only_body_returns_title() {
let chunks = chunk_document("Title", " \n\n ");
assert_eq!(chunks, vec!["Title"]);
}
#[test]
fn filters_empty_paragraphs() {
let chunks = chunk_document("T", "Para 1.\n\n\n\nPara 2.");
assert_eq!(chunks.len(), 2);
}
#[test]
fn empty_title() {
let chunks = chunk_document("", "Only body.");
assert_eq!(chunks, vec!["Only body."]);
}
}