vertx_tcp_eventbus_bridge_client_rust/
codec.rs1use 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 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}