Skip to content

Commit 31b8e58

Browse files
authored
Merge pull request #246 from 3v1n0/fix-parsing-relative-times
relative: Support parsing floating relative values with spaces
2 parents 9de30f5 + d6ab892 commit 31b8e58

File tree

2 files changed

+51
-2
lines changed

2 files changed

+51
-2
lines changed

src/items/relative.rs

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub(super) fn parse(input: &mut &str) -> ModalResult<Relative> {
8383
fn seconds(input: &mut &str) -> ModalResult<Relative> {
8484
(
8585
opt(alt((s('+').value(1), s('-').value(-1)))),
86-
sec_and_nsec,
86+
s(sec_and_nsec),
8787
s(alpha1).verify(|s: &str| matches!(s, "seconds" | "second" | "sec" | "secs")),
8888
ago,
8989
)
@@ -138,41 +138,54 @@ mod tests {
138138
("secs", Relative::Seconds(1, 0)),
139139
("second ago", Relative::Seconds(-1, 0)),
140140
("3 seconds", Relative::Seconds(3, 0)),
141+
("+ 3 seconds", Relative::Seconds(3, 0)),
141142
("3.5 seconds", Relative::Seconds(3, 500_000_000)),
142143
("-3.5 seconds", Relative::Seconds(-4, 500_000_000)),
143144
("+3.5 seconds", Relative::Seconds(3, 500_000_000)),
145+
("+ 3.5 seconds", Relative::Seconds(3, 500_000_000)),
144146
("3.5 seconds ago", Relative::Seconds(-4, 500_000_000)),
145-
("-3.5 seconds ago", Relative::Seconds(3, 500_000_000)),
147+
("- 3.5 seconds ago", Relative::Seconds(3, 500_000_000)),
146148
// Minutes
147149
("minute", Relative::Minutes(1)),
148150
("minutes", Relative::Minutes(1)),
149151
("min", Relative::Minutes(1)),
150152
("mins", Relative::Minutes(1)),
151153
("10 minutes", Relative::Minutes(10)),
152154
("-10 minutes", Relative::Minutes(-10)),
155+
("- 10 minutes", Relative::Minutes(-10)),
153156
("10 minutes ago", Relative::Minutes(-10)),
154157
("-10 minutes ago", Relative::Minutes(10)),
158+
("- 10 minutes ago", Relative::Minutes(10)),
159+
("-10 minutes ago", Relative::Minutes(10)),
160+
("- 10 minutes ago", Relative::Minutes(10)),
155161
// Hours
156162
("hour", Relative::Hours(1)),
157163
("hours", Relative::Hours(1)),
158164
("10 hours", Relative::Hours(10)),
159165
("+10 hours", Relative::Hours(10)),
166+
("+ 10 hours", Relative::Hours(10)),
160167
("-10 hours", Relative::Hours(-10)),
168+
("- 10 hours", Relative::Hours(-10)),
161169
("10 hours ago", Relative::Hours(-10)),
162170
("-10 hours ago", Relative::Hours(10)),
171+
("- 10 hours ago", Relative::Hours(10)),
163172
// Days
164173
("day", Relative::Days(1)),
165174
("days", Relative::Days(1)),
166175
("10 days", Relative::Days(10)),
167176
("+10 days", Relative::Days(10)),
177+
("+ 10 days", Relative::Days(10)),
168178
("-10 days", Relative::Days(-10)),
179+
("- 10 days", Relative::Days(-10)),
169180
("10 days ago", Relative::Days(-10)),
170181
("-10 days ago", Relative::Days(10)),
182+
("- 10 days ago", Relative::Days(10)),
171183
// Multiple days
172184
("fortnight", Relative::Days(14)),
173185
("fortnights", Relative::Days(14)),
174186
("2 fortnights ago", Relative::Days(-28)),
175187
("+2 fortnights ago", Relative::Days(-28)),
188+
("+ 2 fortnights ago", Relative::Days(-28)),
176189
("week", Relative::Days(7)),
177190
("weeks", Relative::Days(7)),
178191
("2 weeks ago", Relative::Days(-14)),

src/lib.rs

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -307,6 +307,42 @@ mod tests {
307307
assert!(parse_datetime(relative_time).is_ok());
308308
}
309309
}
310+
311+
#[test]
312+
fn integer_seconds_offset() {
313+
let dt = "0 + 0 seconds";
314+
assert!(parse_datetime(dt).is_ok());
315+
}
316+
317+
#[test]
318+
fn integer_seconds_offset_spaceless() {
319+
let dt = "0+0 seconds";
320+
assert!(parse_datetime(dt).is_ok());
321+
}
322+
323+
#[test]
324+
fn floating_seconds_offset() {
325+
let dt = "0 + 0.0 seconds";
326+
assert!(parse_datetime(dt).is_ok());
327+
}
328+
329+
#[test]
330+
fn floating_seconds_offset_spaceless() {
331+
let dt = "0+0.0 seconds";
332+
assert!(parse_datetime(dt).is_ok());
333+
}
334+
335+
#[test]
336+
fn floating_seconds_offset_from_now() {
337+
let dt = "now + 1.5 seconds";
338+
assert!(parse_datetime(dt).is_ok());
339+
}
340+
341+
#[test]
342+
fn floating_seconds_offset_from_tomorrow_spaceless() {
343+
let dt = "tomorrow+1.5 seconds";
344+
assert!(parse_datetime(dt).is_ok());
345+
}
310346
}
311347

312348
#[cfg(test)]

0 commit comments

Comments
 (0)