help command now no longer relies on help_strings const

timeparser updated to work with partially specified times
This commit is contained in:
2021-02-23 13:45:25 +00:00
parent 3075e34fe1
commit 7b6464d5a4
14 changed files with 92 additions and 100 deletions

View File

@ -4,7 +4,7 @@ use std::fmt::{Display, Formatter, Result as FmtResult};
use crate::consts::{LOCAL_TIMEZONE, PYTHON_LOCATION};
use chrono::TimeZone;
use chrono::{DateTime, Datelike, Timelike, Utc};
use chrono_tz::Tz;
use std::convert::TryFrom;
use std::str::from_utf8;
@ -95,35 +95,63 @@ impl TimeParser {
}
fn process_explicit(&self) -> Result<i64, InvalidTime> {
let segments = self.time_string.matches('-').count();
let mut time = Utc::now()
.with_timezone(&self.timezone)
.with_second(0)
.unwrap();
let parse_string = if segments == 1 {
let slashes = self.time_string.matches('/').count();
let mut segments = self.time_string.rsplit('-');
// this segment will always exist even if split fails
let hms = segments.next().unwrap();
match slashes {
0 => Ok("%d-".to_string()),
1 => Ok("%d/%m-".to_string()),
2 => Ok("%d/%m/%Y-".to_string()),
_ => Err(InvalidTime::ParseErrorDMY),
let h_m_s = hms.split(':');
for (t, setter) in h_m_s.take(3).zip(&[
DateTime::with_hour,
DateTime::with_minute,
DateTime::with_second,
]) {
time = setter(&time, t.parse().map_err(|_| InvalidTime::ParseErrorHMS)?)
.map_or_else(|| Err(InvalidTime::ParseErrorHMS), |inner| Ok(inner))?;
}
if let Some(dmy) = segments.next() {
let mut d_m_y = dmy.split('/');
let day = d_m_y.next();
let month = d_m_y.next();
let year = d_m_y.next();
for (t, setter) in [day, month]
.iter()
.zip(&[DateTime::with_day, DateTime::with_month])
{
if let Some(t) = t {
time = setter(&time, t.parse().map_err(|_| InvalidTime::ParseErrorDMY)?)
.map_or_else(|| Err(InvalidTime::ParseErrorDMY), |inner| Ok(inner))?;
}
}
} else {
Ok("".to_string())
}? + {
let colons = self.time_string.matches(':').count();
match colons {
1 => Ok("%H:%M"),
2 => Ok("%H:%M:%S"),
_ => Err(InvalidTime::ParseErrorHMS),
if let Some(year) = year {
if year.len() == 4 {
time = time
.with_year(year.parse().map_err(|_| InvalidTime::ParseErrorDMY)?)
.map_or_else(|| Err(InvalidTime::ParseErrorDMY), |inner| Ok(inner))?;
} else if year.len() == 2 {
time = time
.with_year(
format!("20{}", year)
.parse()
.map_err(|_| InvalidTime::ParseErrorDMY)?,
)
.map_or_else(|| Err(InvalidTime::ParseErrorDMY), |inner| Ok(inner))?;
} else {
Err(InvalidTime::ParseErrorDMY)?;
}
}
}?;
}
let dt = self
.timezone
.datetime_from_str(self.time_string.as_str(), &parse_string)
.map_err(|_| InvalidTime::ParseErrorChrono)?;
Ok(dt.timestamp() as i64)
Ok(time.timestamp() as i64)
}
fn process_displacement(&self) -> Result<i64, InvalidTime> {