use crate::detail::token::{is_free_token, Token, TokenKind};
use crate::detail::util::to_int;
use crate::element::{Element, ElementKind};
fn is_year_shaped(value: &str) -> bool {
let number = to_int(value);
1950 < number && number < 2050
}
pub(super) fn parse_year(tokens: &mut [Token]) -> Option<Element> {
let len = tokens.len();
if len < 3 {
return None;
}
let index = (0..=len - 3).find(|&i| {
let is_isolated = tokens
.get(i)
.is_some_and(|t| t.kind == TokenKind::OpenBracket)
&& tokens
.get(i + 2)
.is_some_and(|t| t.kind == TokenKind::CloseBracket);
if !is_isolated {
return false;
}
let Some(middle) = tokens.get(i + 1) else {
return false;
};
is_free_token(middle) && middle.is_number && is_year_shaped(&middle.value)
});
if let Some(index) = index {
let token = tokens.get_mut(index + 1)?;
token.element_kind = Some(ElementKind::Year);
return Some(Element {
kind: ElementKind::Year,
value: token.value.clone(),
position: token.position,
});
}
let index = tokens
.iter()
.position(|t| is_free_token(t) && t.is_number && is_year_shaped(&t.value))?;
let token = tokens.get_mut(index)?;
token.element_kind = Some(ElementKind::Year);
Some(Element {
kind: ElementKind::Year,
value: token.value.clone(),
position: token.position,
})
}