Skip to main content

camel_component_grpc/
codec.rs

1use 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}