typed_envelope.rs

 1use crate::{PeerId, RequestMessage};
 2use anyhow::{Result, anyhow};
 3use std::{marker::PhantomData, time::Instant};
 4
 5pub struct Receipt<T> {
 6    pub sender_id: PeerId,
 7    pub message_id: u32,
 8    payload_type: PhantomData<T>,
 9}
10
11impl<T> Clone for Receipt<T> {
12    fn clone(&self) -> Self {
13        *self
14    }
15}
16
17impl<T> Copy for Receipt<T> {}
18
19#[derive(Clone, Debug)]
20pub struct TypedEnvelope<T> {
21    pub sender_id: PeerId,
22    pub original_sender_id: Option<PeerId>,
23    pub message_id: u32,
24    pub payload: T,
25    pub received_at: Instant,
26}
27
28impl<T> TypedEnvelope<T> {
29    pub fn original_sender_id(&self) -> Result<PeerId> {
30        self.original_sender_id
31            .ok_or_else(|| anyhow!("missing original_sender_id"))
32    }
33}
34
35impl<T: RequestMessage> TypedEnvelope<T> {
36    pub fn receipt(&self) -> Receipt<T> {
37        Receipt {
38            sender_id: self.sender_id,
39            message_id: self.message_id,
40            payload_type: PhantomData,
41        }
42    }
43}