From f1f4c2ea2c5d93d14c2fca7108284c549812f7fe Mon Sep 17 00:00:00 2001 From: ppom Date: Tue, 3 Jun 2025 12:00:00 +0200 Subject: [PATCH] WIP custom Time Permitting custom de/serialiazing --- src/concepts/mod.rs | 5 +- src/concepts/time.rs | 147 +++++++++++++++++++++++++++++++++++++ src/daemon/filter/tests.rs | 13 ++-- src/daemon/mod.rs | 5 +- src/daemon/socket.rs | 5 +- src/daemon/stream.rs | 5 +- src/treedb/helpers.rs | 38 +++------- src/treedb/mod.rs | 12 ++- src/treedb/raw.rs | 84 ++++++++++++--------- 9 files changed, 227 insertions(+), 87 deletions(-) create mode 100644 src/concepts/time.rs diff --git a/src/concepts/mod.rs b/src/concepts/mod.rs index a163286..136c84e 100644 --- a/src/concepts/mod.rs +++ b/src/concepts/mod.rs @@ -4,6 +4,7 @@ mod filter; mod parse_duration; mod pattern; mod stream; +mod time; pub use action::Action; pub use config::{Config, Patterns}; @@ -12,10 +13,8 @@ use parse_duration::parse_duration; pub use pattern::Pattern; use serde::{Deserialize, Serialize}; pub use stream::Stream; +pub use time::{Time, TimeDelta}; -use chrono::{DateTime, Local}; - -pub type Time = DateTime; pub type Match = Vec; #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] diff --git a/src/concepts/time.rs b/src/concepts/time.rs new file mode 100644 index 0000000..b29a770 --- /dev/null +++ b/src/concepts/time.rs @@ -0,0 +1,147 @@ +use std::ops::{Add, Deref, DerefMut, Sub}; + +use chrono::{DateTime, Local, TimeZone}; +use serde::{de::Visitor, Deserialize, Serialize}; + +pub use chrono::TimeDelta; + +#[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] +pub struct Time(DateTime); + +impl Time { + pub fn now() -> Time { + Time(Local::now()) + } + + pub fn timestamp_micros(value: i64) -> Result { + match Local.timestamp_micros(value) { + chrono::offset::LocalResult::Single(time) => Ok(Time(time)), + chrono::offset::LocalResult::Ambiguous(a, b) => Err(format!( + "number can't represent a UNIX timestamp in microseconds. is {a} or {b}" + )), + chrono::offset::LocalResult::None => { + Err("number can't represent a UNIX timestamp in microseconds".into()) + } + } + } +} + +impl Default for Time { + fn default() -> Self { + Time(Local.timestamp_opt(0, 0).unwrap()) + } +} + +impl From> for Time { + fn from(value: DateTime) -> Self { + Time(value) + } +} + +impl Deref for Time { + type Target = DateTime; + + fn deref(&self) -> &Self::Target { + &self.0 + } +} + +impl DerefMut for Time { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.0 + } +} + +impl Add for Time { + type Output = Time; + + fn add(self, rhs: TimeDelta) -> Self::Output { + Time(self.0 + rhs) + } +} + +impl Sub