vertx_tcp_eventbus_bridge_client_rust/
codec.rs

1use std::io::Error as IoError;
2use std::io::ErrorKind;
3use std::u32;
4
5use bytes::BigEndian;
6use bytes::BufMut;
7use bytes::ByteOrder;
8use bytes::BytesMut;
9use tokio::codec::{Decoder, Encoder};
10
11use crate::request::Request;
12use crate::response::Response;
13
14pub struct RequestCodec;
15
16pub struct ResponseCodec;
17
18impl Encoder for RequestCodec {
19    type Item = Request;
20    type Error = IoError;
21
22    fn encode(&mut self, item: Self::Item, dst: &mut BytesMut) -> Result<(), Self::Error> {
23        let data = item.to_json().to_string();
24        let len = data.len();
25        if len > u32::max_value() as usize {
26            // to long
27            return Err(IoError::new(ErrorKind::InvalidInput, "len is too long (> u32::MAX)"));
28        }
29        dst.reserve(4 + len);
30        dst.put_u32_be(len as u32);
31        dst.put(data);
32        Ok(())
33    }
34}
35
36impl Decoder for ResponseCodec {
37    type Item = (Response, String);
38    type Error = IoError;
39
40    fn decode(&mut self, src: &mut BytesMut) -> Result<Option<Self::Item>, Self::Error> {
41        let len = BigEndian::read_u32(src.as_ref()) as usize;
42        if len + 4 > src.len() {
43            return Ok(None);
44        }
45        let mut rest = src.split_to(4 + len);
46        let rest = rest.split_off(4);
47        let result = Response::from_slice(rest.as_ref());
48        Ok(Some(result))
49    }
50}