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
use protobuf::Message;
use crate::protocol::service::ServiceMessage;
use crate::protos::component;
use crate::protos::prelude::*;
use crate::protos::service;
pub enum ComponentMessage {
Service(ServiceMessage),
Heartbeat,
}
impl FromProto<component::ComponentMessage> for ComponentMessage {
fn from_proto(msg: component::ComponentMessage) -> Result<Self, ProtoConversionError> {
use component::ComponentMessageType::*;
match msg.get_message_type() {
SERVICE => Ok(ComponentMessage::Service(FromBytes::<
service::ServiceMessage,
>::from_bytes(
msg.get_payload()
)?)),
COMPONENT_HEARTBEAT => Ok(ComponentMessage::Heartbeat),
UNSET_COMPONENT_MESSAGE_TYPE => Err(ProtoConversionError::InvalidTypeError(
"message type not set".into(),
)),
}
}
}
impl FromNative<ComponentMessage> for component::ComponentMessage {
fn from_native(msg: ComponentMessage) -> Result<Self, ProtoConversionError> {
let mut proto_msg = component::ComponentMessage::new();
use component::ComponentMessageType::*;
match msg {
ComponentMessage::Service(service_msg) => {
proto_msg.set_message_type(SERVICE);
proto_msg.set_payload(IntoBytes::<service::ServiceMessage>::into_bytes(
service_msg,
)?);
}
ComponentMessage::Heartbeat => {
proto_msg.set_message_type(COMPONENT_HEARTBEAT);
proto_msg.set_payload(
component::ComponentHeartbeat::new()
.write_to_bytes()
.map_err(|err| ProtoConversionError::SerializationError(err.to_string()))?,
);
}
}
Ok(proto_msg)
}
}