keri_core/database/
timestamped.rs1use 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>;