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}