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
93
94
95
96
97
98
99
use std::fmt::{self, Display, Formatter};
use derive_more::From;
use fmt::Debug;
use hex_fmt::HexFmt;
use serde::{Deserialize, Serialize};
use crate::{
components::{consensus, gossiper, small_network::GossipedAddress},
types::{Deploy, Item, Tag},
};
#[derive(Clone, From, Serialize, Deserialize)]
pub enum Message {
#[from]
Consensus(consensus::ConsensusMessage),
#[from]
DeployGossiper(gossiper::Message<Deploy>),
#[from]
AddressGossiper(gossiper::Message<GossipedAddress>),
GetRequest {
tag: Tag,
serialized_id: Vec<u8>,
},
GetResponse {
tag: Tag,
serialized_item: Vec<u8>,
},
}
impl Message {
pub(crate) fn new_get_request<T: Item>(id: &T::Id) -> Result<Self, bincode::Error> {
Ok(Message::GetRequest {
tag: T::TAG,
serialized_id: bincode::serialize(id)?,
})
}
pub(crate) fn new_get_response<T: Item>(item: &T) -> Result<Self, bincode::Error> {
Ok(Message::GetResponse {
tag: T::TAG,
serialized_item: bincode::serialize(item)?,
})
}
}
impl Debug for Message {
fn fmt(&self, f: &mut Formatter<'_>) -> fmt::Result {
match self {
Message::Consensus(c) => f.debug_tuple("Consensus").field(&c).finish(),
Message::DeployGossiper(dg) => f.debug_tuple("DeployGossiper").field(&dg).finish(),
Message::AddressGossiper(ga) => f.debug_tuple("AddressGossiper").field(&ga).finish(),
Message::GetRequest { tag, serialized_id } => f
.debug_struct("GetRequest")
.field("tag", tag)
.field("serialized_item", &HexFmt(serialized_id))
.finish(),
Message::GetResponse {
tag,
serialized_item,
} => f
.debug_struct("GetResponse")
.field("tag", tag)
.field("serialized_item", &HexFmt(serialized_item))
.finish(),
}
}
}
impl Display for Message {
fn fmt(&self, f: &mut Formatter) -> fmt::Result {
match self {
Message::Consensus(consensus) => write!(f, "Consensus::{}", consensus),
Message::DeployGossiper(deploy) => write!(f, "DeployGossiper::{}", deploy),
Message::AddressGossiper(gossiped_address) => {
write!(f, "AddressGossiper::({})", gossiped_address)
}
Message::GetRequest { tag, serialized_id } => {
write!(f, "GetRequest({}-{:10})", tag, HexFmt(serialized_id))
}
Message::GetResponse {
tag,
serialized_item,
} => write!(f, "GetResponse({}-{:10})", tag, HexFmt(serialized_item)),
}
}
}