use crate::components::FastComponents;
use chrono::{DateTime, Local};
#[derive(Debug, Clone)]
pub struct ReferenceWithTimezone {
pub instant: DateTime<Local>,
pub timezone_offset: Option<i32>,
}
impl ReferenceWithTimezone {
pub fn new(instant: DateTime<Local>, timezone_offset: Option<i32>) -> Self {
Self {
instant,
timezone_offset,
}
}
pub fn now() -> Self {
Self {
instant: Local::now(),
timezone_offset: None,
}
}
pub fn get_timezone_offset(&self) -> i32 {
self.timezone_offset
.unwrap_or_else(|| -self.instant.offset().utc_minus_local() / 60)
}
pub fn get_system_timezone_adjustment(
&self,
date: Option<DateTime<Local>>,
override_offset: Option<i32>,
) -> i32 {
let date = date.unwrap_or_else(Local::now);
let current_offset = -date.offset().utc_minus_local() / 60;
let target_offset = override_offset.unwrap_or_else(|| self.get_timezone_offset());
current_offset - target_offset
}
}
#[derive(Debug, Clone)]
pub struct ParsedResult {
pub ref_date: DateTime<Local>,
pub index: usize,
pub end_index: usize,
pub text: String,
pub start: FastComponents,
pub end: Option<FastComponents>,
}
impl ParsedResult {
pub fn new(
reference: &ReferenceWithTimezone,
index: usize,
text: impl Into<String>,
start: FastComponents,
end: Option<FastComponents>,
) -> Self {
let text = text.into();
let end_index = index + text.len();
Self {
ref_date: reference.instant,
index,
end_index,
text,
start,
end,
}
}
pub fn date(&self, reference: &ReferenceWithTimezone) -> Option<DateTime<Local>> {
self.start.to_datetime(reference)
}
}