#tokio-util #tokio-codec #decoder #encoder #impl #encode #decode

tokio_x_codec

tokio codec. 自动实现 tokio_util::codec::Encoder 和 tokio_util::codec::Decoder。

1 个不稳定版本

0.0.1-beta12024年7月7日

#639编码

Download history 104/week @ 2024-07-06 5/week @ 2024-07-13 9/week @ 2024-07-27

每月下载量 118

MIT 许可证

13KB
317

tokio_x_codec

License

示例

use futures_util::{SinkExt, StreamExt};
use std::io::Error;
use std::net::{Ipv4Addr, SocketAddr};
use tokio_x_codec::{
   CommonDecoder, CommonDecoderState, CommonEncodeState, CommonEncoder, Decode, Encode,
   EncodedSize, InvalidData,
};
use tokio_util::bytes::{Buf, BufMut, BytesMut};

struct Foo(u32);

impl Encode for Foo {
   fn encode(
      self,
      dst: &mut BytesMut,
      _state: &mut Option<CommonEncodeState>,
   ) -> Result<(), Error> {
      dst.put_u32(self.0);
      Ok(())
   }
}
impl Decode for Foo {
   fn decode(
      src: &mut BytesMut,
      _state: &mut Option<CommonDecoderState>,
   ) -> Result<Option<Self>, Error>
   where
      Self: Sized,
   {
      Ok(Some(Foo(src.get_u32())))
   }
}
impl EncodedSize for Foo {
   fn size(data: &[u8]) -> Result<Option<usize>, InvalidData> {
      Ok(Some(core::mem::size_of::<u32>()))
   }
}

// Encode: impl tokio_util::codec::Encoder<Msg> for tokio_x_codec::CommonEncoder
// Decode: impl Decoder for CommonDecoder<Msg>
#[derive(Encode, Decode)]
enum Msg {
   A { a: u32, b: f32, d: String, e: u8 },
   B(tokio_util::bytes::Bytes),
   C(String, u32),
   D,
   E(Foo),
}

#[tokio::main]
async fn main() {
   let tcp_stream =
      tokio::net::TcpStream::connect(SocketAddr::new(Ipv4Addr::UNSPECIFIED.into(), 0))
         .await
         .unwrap();
   let (reader, writer) = tcp_stream.into_split();
   tokio::spawn(async move {
      let mut framed_read =
         tokio_util::codec::FramedRead::new(reader, CommonDecoder::<Msg>::default());
      while let Some(msg) = framed_read.next().await {
         let _msg: Msg = msg.unwrap();
      }
   });

   let mut framed_write = tokio_util::codec::FramedWrite::new(writer, CommonEncoder::default());

   framed_write
      .send(Msg::C("XXX".to_string(), 12))
      .await
      .unwrap();
}

依赖项

~3–12MB
~112K SLoC