camel_component_grpc/
codec.rs1use bytes::{Buf, BufMut};
2use tonic::Status;
3use tonic::codec::{Codec, DecodeBuf, Decoder, EncodeBuf, Encoder};
4
5pub struct RawBytesCodec;
6
7impl Codec for RawBytesCodec {
8 type Encode = Vec<u8>;
9 type Decode = Vec<u8>;
10 type Encoder = RawBytesEncoder;
11 type Decoder = RawBytesDecoder;
12
13 fn encoder(&mut self) -> Self::Encoder {
14 RawBytesEncoder
15 }
16
17 fn decoder(&mut self) -> Self::Decoder {
18 RawBytesDecoder
19 }
20}
21
22pub struct RawBytesEncoder;
23
24impl Encoder for RawBytesEncoder {
25 type Item = Vec<u8>;
26 type Error = Status;
27
28 fn encode(&mut self, item: Self::Item, buf: &mut EncodeBuf<'_>) -> Result<(), Self::Error> {
29 buf.put_slice(&item);
30 Ok(())
31 }
32}
33
34pub struct RawBytesDecoder;
35
36impl Decoder for RawBytesDecoder {
37 type Item = Vec<u8>;
38 type Error = Status;
39
40 fn decode(&mut self, buf: &mut DecodeBuf<'_>) -> Result<Option<Self::Item>, Self::Error> {
41 if buf.remaining() == 0 {
42 return Ok(None);
43 }
44 let data = buf.copy_to_bytes(buf.remaining()).to_vec();
45 Ok(Some(data))
46 }
47}
48
49#[cfg(test)]
50mod tests {
51 use super::*;
52
53 #[test]
54 fn test_raw_bytes_codec_constructs() {
55 let mut codec = RawBytesCodec;
56 let _encoder = codec.encoder();
57 let _decoder = codec.decoder();
58 }
59
60 #[test]
61 fn test_codec_type_aliases() {
62 let mut codec = RawBytesCodec;
63 let encoder: RawBytesEncoder = codec.encoder();
64 let decoder: RawBytesDecoder = codec.decoder();
65 let _ = (encoder, decoder);
66 }
67
68 #[test]
69 fn test_encoder_is_unit_struct() {
70 let e1 = RawBytesEncoder;
71 let e2 = RawBytesEncoder;
72 let _ = (e1, e2);
73 }
74
75 #[test]
76 fn test_decoder_is_unit_struct() {
77 let d1 = RawBytesDecoder;
78 let d2 = RawBytesDecoder;
79 let _ = (d1, d2);
80 }
81
82 #[test]
83 fn test_codec_encoder_decoder_associated_types() {
84 fn assert_codec<C: Codec>()
85 where
86 C::Encode: Clone,
87 C::Decode: Clone,
88 {
89 }
90 assert_codec::<RawBytesCodec>();
91 }
92}