#[cfg(feature = "locale")]
use crate::locale_prefers_day_first;
use crate::{ConnectorType, DateClassification, OrderFirst, Token};
#[inline]
pub(crate) fn smart_detect_date_order(s: &str, class: &DateClassification) -> OrderFirst {
if class.is_pure_numeric && class.num_digits >= 6 {
return OrderFirst::Year;
}
let s = s.trim_start_matches(['+', '-']);
if matches!(class.date_tokens.first(), Some(Token::Digits(n)) if *n >= 4)
&& let Some(year_candidate) = s.get(0..4).and_then(|p| p.parse::<u16>().ok())
&& (1900..=2100).contains(&year_candidate)
{
return OrderFirst::Year;
}
let mut num_iter = s.split(['/', '-', '.', ' ', 'T']).filter_map(|p| {
let p = p.trim();
if p.is_empty() {
None
} else {
p.parse::<u32>().ok()
}
});
let first = num_iter.next().unwrap_or(0);
if first > 12 && first <= 31 {
return OrderFirst::Day;
}
let second = if (1..=12).contains(&first) {
num_iter.next().unwrap_or(0)
} else {
0
};
if second > 12 && second <= 31 {
return OrderFirst::Month;
}
if class.connector == ConnectorType::UpperT || class.has_offset_or_zone() {
return OrderFirst::Year;
}
#[cfg(feature = "locale")]
{
if locale_prefers_day_first() {
OrderFirst::Day
} else {
OrderFirst::Month
}
}
#[cfg(not(feature = "locale"))]
{
OrderFirst::Day
}
}