xmtp_api_d14n/protocol/extractors/
timestamp.rs1use chrono::Utc;
4use xmtp_proto::ConversionError;
5use xmtp_proto::mls_v1::welcome_message::WelcomePointer;
6use xmtp_proto::xmtp::mls::api::v1::{
7 group_message::V1 as V3GroupMessage, welcome_message::V1 as V3WelcomeMessage,
8};
9use xmtp_proto::xmtp::xmtpv4::envelopes::UnsignedOriginatorEnvelope;
10
11use crate::protocol::{EnvelopeVisitor, Extractor};
12
13#[derive(Default, Clone, Debug)]
15pub struct TimestampExtractor {
16 time: Option<i64>,
17}
18
19impl TimestampExtractor {
20 pub fn new() -> Self {
21 Default::default()
22 }
23}
24
25impl Extractor for TimestampExtractor {
26 type Output = Option<chrono::DateTime<Utc>>;
27
28 fn get(self) -> Self::Output {
29 self.time.map(chrono::DateTime::from_timestamp_nanos)
30 }
31}
32
33impl EnvelopeVisitor<'_> for TimestampExtractor {
34 type Error = ConversionError;
35
36 fn visit_unsigned_originator(
37 &mut self,
38 e: &UnsignedOriginatorEnvelope,
39 ) -> Result<(), Self::Error> {
40 self.time = Some(e.originator_ns);
41 Ok(())
42 }
43
44 fn visit_v3_group_message(&mut self, message: &V3GroupMessage) -> Result<(), Self::Error> {
45 self.time = Some(message.created_ns as i64);
46 Ok(())
47 }
48
49 fn visit_v3_welcome_message(&mut self, message: &V3WelcomeMessage) -> Result<(), Self::Error> {
50 self.time = Some(message.created_ns as i64);
51 Ok(())
52 }
53 fn visit_v3_welcome_pointer(&mut self, ptr: &WelcomePointer) -> Result<(), Self::Error> {
54 self.time = Some(ptr.created_ns as i64);
55 Ok(())
56 }
57}