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)
}
}