Skip to main content

chrono_node/common/
merge_date_time.rs

1//! upstream `common/refiners/AbstractMergeDateTimeRefiner.ts`.
2//!
3//! Implement [`MergeDateTimePattern`] (the locale's connector pattern) and wrap it:
4//! `Box::new(Merging::new(MergeDateTime(MyPattern)))`.
5
6use crate::calculation::merging::merge_date_time_result;
7use crate::common::abstract_refiners::MergingRefiner;
8use crate::core::context::ParsingContext;
9use crate::core::regex::JsRegex;
10use crate::core::result::ParsingResult;
11use crate::core::utils::js::js_trim;
12
13/// upstream `patternBetween()`.
14pub trait MergeDateTimePattern: Send + Sync {
15    fn pattern_between(&self) -> &JsRegex;
16}
17
18pub struct MergeDateTime<P>(pub P);
19
20impl<P: MergeDateTimePattern> MergingRefiner for MergeDateTime<P> {
21    fn should_merge_results(
22        &self,
23        text_between: &str,
24        current: &ParsingResult,
25        next: &ParsingResult,
26        _context: &ParsingContext,
27    ) -> bool {
28        let is_date_then_time = current.start.is_only_date() && next.start.is_only_time();
29        let is_time_then_date = current.start.is_only_time() && next.start.is_only_date();
30        // A bare ":" is only a connector in the "date:time" direction (e.g. "05/31/2024:14:15").
31        if is_time_then_date && js_trim(text_between) == ":" {
32            return false;
33        }
34        (is_date_then_time || is_time_then_date) && self.0.pattern_between().is_match(text_between)
35    }
36
37    fn merge_results(
38        &self,
39        text_between: &str,
40        current: ParsingResult,
41        next: ParsingResult,
42        _context: &ParsingContext,
43    ) -> ParsingResult {
44        let mut result = if current.start.is_only_date() {
45            merge_date_time_result(&current, &next)
46        } else {
47            merge_date_time_result(&next, &current)
48        };
49        result.index = current.index;
50        result.text = format!("{}{}{}", current.text, text_between, next.text);
51        result
52    }
53}