#[cfg(test)]
#[path = "multiline_tests.rs"]
mod multiline_tests;
use regex::Regex;
#[derive(Debug)]
pub struct MultilineMerger {
start_pattern: Regex,
separator: String,
}
impl MultilineMerger {
pub fn new(start_pattern: &str, separator: impl Into<String>) -> Result<Self, String> {
let re = Regex::new(start_pattern)
.map_err(|e| format!("Invalid start pattern '{}': {}", start_pattern, e))?;
Ok(Self {
start_pattern: re,
separator: separator.into(),
})
}
pub fn merge(&self, lines: &[String]) -> Vec<String> {
let mut blocks: Vec<String> = Vec::new();
let mut current: Option<String> = None;
for line in lines {
if self.start_pattern.is_match(line) {
if let Some(block) = current.take() {
blocks.push(block);
}
current = Some(line.clone());
} else {
match &mut current {
Some(block) => {
block.push_str(&self.separator);
block.push_str(line);
}
None => {
current = Some(line.clone());
}
}
}
}
if let Some(block) = current {
blocks.push(block);
}
blocks
}
}