use derive_more::From; use sena::{ csp::{ comm::TxChan, shutdown::ShutdownTx, tokio::{ comm::{self, RecvError}, shutdown::{self, SendError, ShutdownError}, }, }, handling::{handler::Handler, server::ServeOptions}, }; use tokio::sync::{mpsc, oneshot}; #[derive(Debug, From)] pub enum Error { Shutdown(ShutdownError), Recv(RecvError), ShutSend(SendError), ResponseRecv(oneshot::error::RecvError), Send(mpsc::error::SendError), } fn increment() -> impl Handler { |req: i32| async move { Ok(req + 1) } } #[tokio::main(flavor = "current_thread")] async fn main() -> Result<(), Error> { let (shut_tx, shut_rx) = shutdown::make_pair(); let (inc_tx, inc_rx) = comm::bounded::<_, i32, _>(1); let join_handle = tokio::spawn( increment::() .share() .serve(inc_rx, ServeOptions::with_shutdown_token(shut_rx)), ); let res = sena::err_eq!(inc_tx.send(10).await, Error)?; if let Some(response) = res { println!("Got response: {}", response.unwrap()); } else { println!("Got no response"); } println!("Waiting for service to shutdown..."); sena::err_eq!(shut_tx.shutdown().await, Error)?; join_handle.await.unwrap().unwrap(); println!("Done!"); Ok(()) }