diff options
| author | unitexe <unitexe70@gmail.com> | 2026-01-14 16:43:19 -0600 |
|---|---|---|
| committer | unitexe <unitexe70@gmail.com> | 2026-01-14 16:43:37 -0600 |
| commit | 2ad73c4ea94d42579661dce3074cc075f52e6cc7 (patch) | |
| tree | 5f50c05d2b4de11fd9c586cf867d9d21acbc5aa0 /src/main.rs | |
Initial commit
Diffstat (limited to 'src/main.rs')
| -rw-r--r-- | src/main.rs | 57 |
1 files changed, 57 insertions, 0 deletions
diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 0000000..fa3657c --- /dev/null +++ b/src/main.rs @@ -0,0 +1,57 @@ +pub mod pb { + tonic::include_proto!("unit.countah.v0"); +} + +use std::pin::Pin; +use tokio_stream::Stream; +use tokio_stream::wrappers::ReceiverStream; +use tonic::{Request, Response, Status, transport::Server}; + +use crate::pb::{CounterRequest, CounterResponse}; + +#[derive(Debug, Default)] +pub struct PubdServer {} + +#[tonic::async_trait] +impl pb::countah_server::Countah for PubdServer { + type CounterStream = Pin<Box<dyn Stream<Item = Result<CounterResponse, Status>> + Send>>; + + async fn counter( + &self, + _request: Request<CounterRequest>, + ) -> Result<Response<Self::CounterStream>, Status> { + let (tx, rx) = tokio::sync::mpsc::channel(128); + + tokio::spawn(async move { + let mut count: u64 = 0; + loop { + count += 1; + let response = CounterResponse { count }; + + if tx.send(Ok(response)).await.is_err() { + break; + } + + tokio::time::sleep(tokio::time::Duration::from_secs(1)).await; + } + }); + + let stream = ReceiverStream::new(rx); + Ok(Response::new(Box::pin(stream))) + } +} + +#[tokio::main] +async fn main() -> Result<(), Box<dyn std::error::Error>> { + let addr = "0.0.0.0:60069".parse().unwrap(); + let server = PubdServer::default(); + + println!("Listening on {}", addr); + + Server::builder() + .add_service(pb::countah_server::CountahServer::new(server)) + .serve(addr) + .await?; + + Ok(()) +} |
