prost-stream

Crates.ioprost-stream
lib.rsprost-stream
version0.1.2
sourcesrc
created_at2023-11-24 08:41:41.562959
updated_at2023-11-25 06:01:53.345041
descriptionprost stream
homepage
repositoryhttps://github.com/hangj/prost-stream
max_upload_size
id1046886
size11,787
hangj (hangj)

documentation

https://docs.rs/prost-stream/

README

prost-stream

Read protobuf messages from a Stream

Examples

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

With async feature enabled, you can use 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(())
}
Commit count: 5

cargo fmt