1个不稳定版本

0.1.2 2023年11月25日
0.1.1 2023年11月24日
0.1.0 2023年11月24日

#2051 in 编码

MIT许可协议

12KB
200

prost-stream

从Stream中读取protobuf消息

示例

Stream

use prost_stream::Stream;
use std::net::TcpListener;
use std::net::TcpStream;

#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ping {
    #[prost(uint64, tag = "1")]
    pub id: u64,
}

#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Pong {
    #[prost(uint64, tag = "1")]
    pub id: u64,
}

fn main() -> anyhow::Result<()> {    
    let listener = TcpListener::bind("127.0.0.1:0")?;
    let addr = listener.local_addr()?;

    std::thread::spawn(move || {
        let (stream, _) = listener.accept()?;
        let mut stream = Stream::new(stream);

        let _msg: Ping = stream.recv()?;
        stream.send(&Pong::default())?;

        anyhow::Result::<()>::Ok(())
    });

    let client = TcpStream::connect(addr)?;
    let mut client = Stream::new(client);

    client.send(&Ping::default())?;
    let pong: Pong = client.recv()?;

    assert_eq!(pong, Pong::default());

    Ok(())
}

AsyncStream

启用async特性后,您可以使用AsyncStream

use prost_stream::AsyncStream;
use tokio::net::TcpListener;
use tokio::net::TcpStream;

#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Ping {
    #[prost(uint64, tag = "1")]
    pub id: u64,
}

#[derive(Clone, PartialEq, ::prost::Message)]
pub struct Pong {
    #[prost(uint64, tag = "1")]
    pub id: u64,
}

#[tokio::main]
async fn main() -> anyhow::Result<()> {
    let listener = TcpListener::bind("127.0.0.1:0").await?;
    let addr = listener.local_addr()?;

    tokio::spawn(async move {
        let (stream, _) = listener.accept().await?;
        let mut stream = AsyncStream::new(stream);
        let _msg: Ping = stream.recv().await?;
        stream.send(&Pong::default()).await?;

        anyhow::Result::<()>::Ok(())
    });

    let client = TcpStream::connect(addr).await?;
    let mut client = AsyncStream::new(client);

    client.send(&Ping::default()).await?;
    let pong: Pong = client.recv().await?;

    assert_eq!(pong, Pong::default());

    Ok(())
}

依赖项

~0.5–2.2MB
~42K SLoC