Skip to content

Commit 2ecff52

Browse files
committed
refactor: Simplify time filter code
1 parent e0363fc commit 2ecff52

1 file changed

Lines changed: 18 additions & 23 deletions

File tree

src/filter/time.rs

Lines changed: 18 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
use jiff::{civil::DateTime, tz::TimeZone, Span, Timestamp, Zoned};
22

3-
use std::time::SystemTime;
3+
use std::time::{Duration, SystemTime, UNIX_EPOCH};
44

55
/// Filter based on time ranges.
66
#[derive(Debug, PartialEq, Eq)]
@@ -27,28 +27,23 @@ fn now() -> Zoned {
2727

2828
impl TimeFilter {
2929
fn from_str(s: &str) -> Option<SystemTime> {
30-
s.parse::<Span>()
31-
.and_then(|duration| now().checked_sub(duration))
32-
.ok()
33-
.or_else(|| {
34-
let local_tz = TimeZone::system();
35-
s.parse::<Timestamp>()
36-
.map(|ts| ts.to_zoned(TimeZone::UTC))
37-
.ok()
38-
.or_else(|| {
39-
s.parse::<DateTime>()
40-
.map(|dt| local_tz.to_ambiguous_zoned(dt))
41-
.and_then(|zdt| zdt.later())
42-
.ok()
43-
})
44-
.or_else(|| {
45-
let timestamp_secs = s.strip_prefix('@')?.parse().ok()?;
46-
Timestamp::from_second(timestamp_secs)
47-
.map(|ts| ts.to_zoned(TimeZone::UTC))
48-
.ok()
49-
})
50-
})
51-
.map(SystemTime::from)
30+
if let Ok(span) = s.parse::<Span>() {
31+
let datetime = now().checked_sub(span).ok()?;
32+
Some(datetime.into())
33+
} else if let Ok(timestamp) = s.parse::<Timestamp>() {
34+
Some(timestamp.into())
35+
} else if let Ok(datetime) = s.parse::<DateTime>() {
36+
Some(
37+
TimeZone::system()
38+
.to_ambiguous_zoned(datetime)
39+
.later()
40+
.ok()?
41+
.into(),
42+
)
43+
} else {
44+
let timestamp_secs: u64 = s.strip_prefix('@')?.parse().ok()?;
45+
Some(UNIX_EPOCH + Duration::from_secs(timestamp_secs))
46+
}
5247
}
5348

5449
pub fn before(s: &str) -> Option<TimeFilter> {

0 commit comments

Comments
 (0)