use super::components::{Component, ParsingComponents};
use super::js_date::JsDate;
use super::reference::{ReferenceInput, ReferenceWithTimezone};
use super::result::ParsingResult;
use super::timezone::TimezoneAbbrMap;
#[derive(Clone, Debug, Default, PartialEq)]
pub struct ParsingOption {
pub forward_date: bool,
pub timezones: TimezoneAbbrMap,
}
#[derive(Clone, Debug)]
pub struct ParsingContext {
pub text: String,
pub option: ParsingOption,
pub reference: ReferenceWithTimezone,
pub ref_date: JsDate,
}
impl ParsingContext {
pub fn new(text: &str, reference: &ReferenceInput, option: ParsingOption, now: JsDate) -> ParsingContext {
let reference = ReferenceWithTimezone::from_input(reference, &option.timezones, now);
ParsingContext {
text: text.to_string(),
option,
ref_date: reference.instant,
reference,
}
}
pub fn create_parsing_components(&self, known: &[(Component, i64)]) -> ParsingComponents {
ParsingComponents::new(self.reference, known)
}
pub fn create_parsing_result(
&self,
index: usize,
text: impl Into<String>,
start: Option<ParsingComponents>,
end: Option<ParsingComponents>,
) -> ParsingResult {
ParsingResult::new(self.reference, index, text, start, end)
}
pub fn create_parsing_result_to(
&self,
index: usize,
end_index: usize,
start: Option<ParsingComponents>,
end: Option<ParsingComponents>,
) -> ParsingResult {
let text = self.text.get(index..end_index).unwrap_or("").to_string();
ParsingResult::new(self.reference, index, text, start, end)
}
}