Crates.io | prost-stream |
lib.rs | prost-stream |
version | 0.1.2 |
source | src |
created_at | 2023-11-24 08:41:41.562959 |
updated_at | 2023-11-25 06:01:53.345041 |
description | prost stream |
homepage | |
repository | https://github.com/hangj/prost-stream |
max_upload_size | |
id | 1046886 |
size | 11,787 |
Read protobuf messages from a 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(())
}
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(())
}