use super::*; use anyhow::{Context, Error, Result}; use futures::{channel::mpsc::*, future::try_join, lock::Mutex, prelude::*}; use serde_json::json; use std::sync::Arc; use stream::iter; pub async fn greet(sink: &mut T) -> Result<()> where T: Sink + Unpin, { let mut greeting = iter(vec![ ServerMessage::Meta { m: Meta { version: "Unstable", helo: Some("Dedicated base2020 server".into()), }, }, ServerMessage::SetState { u: 0, s: json!({}) }, ]) .map(Ok); sink.send_all(&mut greeting) .await .context("Greeting client") } pub async fn run_client(mut source: I, mut sink: O) -> Result<()> where I: Stream> + Unpin, O: Sink + Unpin, { let output_task = async { greet(&mut sink).await?; Ok::<(), Error>(()) }; let input_task = async { loop { match source.next().await { Some(Ok(msg)) => debug!("Client message: {:?}", &msg), Some(Err(error)) => return Err(error), None => break Ok(()), } } }; try_join(output_task, input_task).await.map(|((), ())| ()) }