1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
use crate::misc::PlumtreeAppMessage;
use crate::node::NodeId;
use bytecodec::bytes::{BytesEncoder, RemainingBytesDecoder, Utf8Decoder, Utf8Encoder};
use bytecodec::{Decode, Encode};
#[derive(Debug, Clone)]
pub struct Message<T: MessagePayload>(PlumtreeAppMessage<T>);
impl<T: MessagePayload> Message<T> {
pub fn id(&self) -> &MessageId {
&self.0.id
}
pub fn payload(&self) -> &T {
&self.0.payload
}
pub fn payload_mut(&mut self) -> &mut T {
&mut self.0.payload
}
pub fn into_payload(self) -> T {
self.0.payload
}
pub(crate) fn new(message: PlumtreeAppMessage<T>) -> Self {
Message(message)
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
pub struct MessageId {
node: NodeId,
seqno: u64,
}
impl MessageId {
pub fn node(&self) -> NodeId {
self.node
}
pub fn seqno(&self) -> u64 {
self.seqno
}
pub(crate) fn new(node: NodeId, seqno: u64) -> Self {
MessageId { node, seqno }
}
}
pub trait MessagePayload: Sized + Clone + Send + 'static {
type Encoder: Encode<Item = Self> + Default + Send + 'static;
type Decoder: Decode<Item = Self> + Default + Send + 'static;
}
impl MessagePayload for Vec<u8> {
type Encoder = BytesEncoder<Vec<u8>>;
type Decoder = RemainingBytesDecoder;
}
impl MessagePayload for String {
type Encoder = Utf8Encoder;
type Decoder = Utf8Decoder;
}