hrpc/client/
socket.rs

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    // TODO: don't allocate here?
11    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}