keri_core/database/
timestamped.rs

1use std::{cmp::Ordering, time::Duration};
2
3use chrono::{DateTime, Local};
4use serde::{Deserialize, Serialize};
5
6use crate::{
7    error::Error,
8    event_message::signed_event_message::{
9        SignedEventMessage, SignedNontransferableReceipt, SignedTransferableReceipt,
10    },
11};
12
13#[derive(Serialize, Deserialize, Debug, Clone)]
14pub struct Timestamped<M> {
15    pub timestamp: DateTime<Local>,
16    pub signed_event_message: M,
17}
18
19impl<M> Timestamped<M> {
20    pub fn new(event: M) -> Self {
21        Self {
22            timestamp: Local::now(),
23            signed_event_message: event,
24        }
25    }
26
27    pub fn is_stale(&self, duration: Duration) -> Result<bool, Error> {
28        Ok(Local::now() - self.timestamp
29            >= chrono::Duration::from_std(duration)
30                .map_err(|_e| Error::SemanticError("Improper duration".into()))?)
31    }
32}
33
34impl From<Timestamped<SignedEventMessage>> for SignedEventMessage {
35    fn from(event: Timestamped<SignedEventMessage>) -> SignedEventMessage {
36        event.signed_event_message
37    }
38}
39
40impl From<Timestamped<SignedNontransferableReceipt>> for SignedNontransferableReceipt {
41    fn from(event: Timestamped<SignedNontransferableReceipt>) -> SignedNontransferableReceipt {
42        event.signed_event_message
43    }
44}
45
46impl From<Timestamped<SignedTransferableReceipt>> for SignedTransferableReceipt {
47    fn from(event: Timestamped<SignedTransferableReceipt>) -> SignedTransferableReceipt {
48        event.signed_event_message
49    }
50}
51
52impl<M> From<M> for Timestamped<M> {
53    fn from(event: M) -> Timestamped<M> {
54        Timestamped::new(event)
55    }
56}
57
58impl<M: Clone> From<&M> for Timestamped<M> {
59    fn from(event: &M) -> Timestamped<M> {
60        Timestamped::new(event.clone())
61    }
62}
63
64impl<M: PartialEq> PartialEq for Timestamped<M> {
65    fn eq(&self, other: &Self) -> bool {
66        self.signed_event_message == other.signed_event_message
67    }
68}
69
70impl PartialOrd for Timestamped<SignedEventMessage> {
71    fn partial_cmp(&self, other: &Self) -> Option<Ordering> {
72        PartialOrd::partial_cmp(
73            &self.signed_event_message.event_message.data.get_sn(),
74            &other.signed_event_message.event_message.data.get_sn(),
75        )
76    }
77}
78
79impl Ord for Timestamped<SignedEventMessage> {
80    fn cmp(&self, other: &Self) -> Ordering {
81        Ord::cmp(
82            &self.signed_event_message.event_message.data.get_sn(),
83            &other.signed_event_message.event_message.data.get_sn(),
84        )
85    }
86}
87
88impl Eq for Timestamped<SignedEventMessage> {}
89
90pub type TimestampedSignedEventMessage = Timestamped<SignedEventMessage>;