summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--CHANGES.md4
-rw-r--r--Cargo.lock4
-rw-r--r--Cargo.toml2
-rw-r--r--README.md1
-rw-r--r--src/lib.rs54
-rw-r--r--tests/tests.rs16
6 files changed, 67 insertions, 14 deletions
diff --git a/CHANGES.md b/CHANGES.md
index 9829457..8ac3e0a 100644
--- a/CHANGES.md
+++ b/CHANGES.md
@@ -22,4 +22,6 @@
* better organization and documentation of grammar
## 1.06
* added "before and after"
-* fixed "Friday the 13th" and "the 31st" to scan back through the calendar to the nearest match \ No newline at end of file
+* fixed "Friday the 13th" and "the 31st" to scan back through the calendar to the nearest match
+## 1.0.7
+* added `<specific_time>` pattern: e.g., 1969-05-06 12:03:05 \ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
index 5c69fb6..62c7e5e 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1,3 +1,5 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
[[package]]
name = "aho-corasick"
version = "0.6.9"
@@ -108,7 +110,7 @@ dependencies = [
[[package]]
name = "two_timer"
-version = "1.0.6"
+version = "1.0.7"
dependencies = [
"chrono 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)",
"lazy_static 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
diff --git a/Cargo.toml b/Cargo.toml
index 26f7151..7ea2a3e 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -1,6 +1,6 @@
[package]
name = "two_timer"
-version = "1.0.6"
+version = "1.0.7"
authors = ["dfhoughton <dfhoughton@gmail.com>"]
description="parser for English time expressions"
homepage="https://github.com/dfhoughton/two-timer"
diff --git a/README.md b/README.md
index e37cd53..96ce49d 100644
--- a/README.md
+++ b/README.md
@@ -36,5 +36,6 @@ Some expressions it can handle:
* 2 weeks ago
* ten seconds from now
* 5 minutes before and after midnight
+* 1969-05-06 12:03:05
The complete API is available at https://docs.rs/two_timer/0.1.0/two_timer/.
diff --git a/src/lib.rs b/src/lib.rs
index b1f6e07..15a11e8 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -269,7 +269,9 @@ lazy_static! {
at_time -> ("at") <time>
- specific_time => <first_time> | <last_time>
+ specific_time => <first_time> | <last_time> | <precise_time>
+
+ precise_time -> <n_date> <hour_24>
time -> <hour_12> <am_pm>? | <hour_24> | <named_time>
@@ -723,6 +725,19 @@ fn specific(m: &Match) -> bool {
m.has("specific_day") || m.has("specific_period") || m.has("specific_time")
}
+fn n_date(date: &Match, config: &Config) -> Result<NaiveDate, TimeError> {
+ let year = year(date, &config.now);
+ let month = n_month(date);
+ let day = n_day(date);
+ match NaiveDate::from_ymd_opt(year, month, day) {
+ None => Err(TimeError::ImpossibleDate(format!(
+ "cannot construct date with year {}, month {}, and day {}",
+ year, month, day
+ ))),
+ Some(d) => Ok(d),
+ }
+}
+
fn handle_specific_day(
m: &Match,
config: &Config,
@@ -764,16 +779,9 @@ fn handle_specific_day(
}
if let Some(date) = m.name("date_with_year") {
if let Some(date) = date.name("n_date") {
- let year = year(date, &now);
- let month = n_month(date);
- let day = n_day(date);
- let d_opt = NaiveDate::from_ymd_opt(year, month, day);
- return match d_opt {
- None => Err(TimeError::ImpossibleDate(format!(
- "cannot construct date with year {}, month {}, and day {}",
- year, month, day
- ))),
- Some(d1) => {
+ return match n_date(date, config) {
+ Err(s) => Err(s),
+ Ok(d1) => {
let d1 = d1.and_hms(0, 0, 0);
Ok(moment_and_time(
&Config::new().now(d1).period(Period::Day),
@@ -1032,6 +1040,30 @@ fn handle_specific_time(
moment: &Match,
config: &Config,
) -> Result<(NaiveDateTime, NaiveDateTime), TimeError> {
+ if let Some(moment) = moment.name("precise_time") {
+ return match n_date(moment, config) {
+ Err(s) => Err(s),
+ Ok(d) => {
+ let (hour, minute, second, _) = time(moment);
+ let period = if second.is_some() {
+ Period::Second
+ } else if minute.is_some() {
+ Period::Minute
+ } else {
+ Period::Hour
+ };
+ let m = d
+ .and_hms(0, 0, 0)
+ .with_hour(hour)
+ .unwrap()
+ .with_minute(minute.unwrap_or(0))
+ .unwrap()
+ .with_second(second.unwrap_or(0))
+ .unwrap();
+ Ok(moment_to_period(m, &period, config))
+ }
+ };
+ }
return if moment.has("first_time") {
Ok(moment_to_period(first_moment(), &config.period, config))
} else {
diff --git a/tests/tests.rs b/tests/tests.rs
index b4c5b5d..7ee0325 100644
--- a/tests/tests.rs
+++ b/tests/tests.rs
@@ -1448,3 +1448,19 @@ fn the_31st() {
}
}
}
+
+#[test]
+fn specific_time() {
+ let d1 = NaiveDate::from_ymd(1969, 5, 6).and_hms(12, 3, 5);
+ let d2 = d1 + Duration::seconds(1);
+ match parse("1969-05-06 12:03:05", None) {
+ Ok((start, end, _)) => {
+ assert_eq!(d1, start);
+ assert_eq!(d2, end);
+ }
+ Err(e) => {
+ println!("{:?}", e);
+ assert!(false, "didn't match");
+ }
+ }
+} \ No newline at end of file