chrono_node/common/
merge_date_time.rs1use 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
13pub 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 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(¤t, &next)
46 } else {
47 merge_date_time_result(&next, ¤t)
48 };
49 result.index = current.index;
50 result.text = format!("{}{}{}", current.text, text_between, next.text);
51 result
52 }
53}