use crate::context::ParsingContext;
use crate::refiners::Refiner;
use crate::results::ParsedResult;
pub struct MergeDateRangeRefiner;
impl Refiner for MergeDateRangeRefiner {
fn refine(&self, context: &ParsingContext, results: Vec<ParsedResult>) -> Vec<ParsedResult> {
if results.len() < 2 {
return results;
}
let mut merged = Vec::with_capacity(results.len());
let mut i = 0;
while i < results.len() {
let current = &results[i];
if i + 1 < results.len() {
let next = &results[i + 1];
let gap_start = current.end_index;
let gap_end = next.index;
if gap_end > gap_start {
let gap = &context.text[gap_start..gap_end];
let gap_trimmed = gap.trim();
let is_range_connector = gap_trimmed == "-"
|| gap_trimmed == "–"
|| gap_trimmed.eq_ignore_ascii_case("bis");
if is_range_connector {
let current_has_date = current.start.get(crate::Component::Day).is_some()
|| current.start.get(crate::Component::Month).is_some();
let next_has_date = next.start.get(crate::Component::Day).is_some()
|| next.start.get(crate::Component::Month).is_some();
if current_has_date && next_has_date {
let merged_result = ParsedResult::new(
context.reference,
current.index,
&context.text[current.index..next.end_index],
current.start,
Some(next.start),
);
merged.push(merged_result);
i += 2;
continue;
}
}
}
}
merged.push(results[i].clone());
i += 1;
}
merged
}
}