use anyhow::{Result, bail}; use dosh::client::DoshClient; use dosh::transport::{SessionEvent, TransportEvent}; #[tokio::main] async fn main() -> Result<()> { let mut args = std::env::args().skip(1); let host = args.next().unwrap_or_else(|| "server".to_string()); let message = args.collect::>().join(" "); let message = if message.is_empty() { "hello from dosh".to_string() } else { message }; let client = DoshClient::load()?; let mut transport = client .connect(host) .service("echo") .connect() .await? .into_transport(); let stream = transport.open_service("echo").await?; loop { match transport.recv().await? { SessionEvent::Stream(TransportEvent::OpenOk { stream_id, .. }) if stream_id == stream => { transport.send(stream, message.as_bytes().to_vec()).await?; } SessionEvent::Stream(TransportEvent::Data(data)) if data.stream_id == stream => { for chunk in data.chunks { print!("{}", String::from_utf8_lossy(&chunk)); } println!(); transport.close(stream).await?; return Ok(()); } SessionEvent::Stream(TransportEvent::OpenReject { reason, .. }) => { bail!("server rejected echo stream: {reason}"); } SessionEvent::Stream(_) | SessionEvent::Ping | SessionEvent::Pong | SessionEvent::Ignored => {} } transport.maintenance().await?; } }