1use bytes::BytesMut;
2use prost::Message as PbMsg;
3
4use crate::{common::socket::DecodeResult, decode::DecodeBodyError, proto::Error as HrpcError};
5
6pub use crate::common::socket::{ReadSocket, Socket, SocketError, WriteSocket};
7
8pub(super) fn encode_message<Msg: PbMsg>(buf: &mut BytesMut, msg: &Msg) -> Vec<u8> {
9 crate::encode::encode_protobuf_message_to(buf, msg);
10 buf.to_vec()
12}
13
14pub(super) fn decode_message<Msg: PbMsg + Default>(
15 raw: Vec<u8>,
16) -> Result<DecodeResult<Msg>, DecodeBodyError> {
17 if raw.is_empty() {
18 return Err(DecodeBodyError::InvalidProtoMessage(
19 prost::DecodeError::new("empty protobuf message"),
20 ));
21 }
22
23 let opcode = raw[0];
24
25 if opcode == 0 {
26 Msg::decode(&raw[1..])
27 .map(DecodeResult::Msg)
28 .map_err(DecodeBodyError::InvalidProtoMessage)
29 } else if opcode == 1 {
30 HrpcError::decode(&raw[1..])
31 .map(DecodeResult::Error)
32 .map_err(DecodeBodyError::InvalidProtoMessage)
33 } else {
34 Err(DecodeBodyError::InvalidBody(Box::new(
35 HrpcError::from((
36 "hrpcrs.http.invalid-socket-message-opcode",
37 "invalid socket binary message opcode",
38 ))
39 .with_details(raw),
40 )))
41 }
42}