a_chat 0.1.0

a asynchronous chat server
Documentation
use a_chat::Result;

use async_std::io::{stdin, BufReader};
use async_std::net::{TcpStream, ToSocketAddrs};
use async_std::prelude::*;
use async_std::task;
use futures::{select, FutureExt};

fn main() {
    if let Err(e) = run() {
        eprint!("{e}");
        std::process::exit(1);
    }
}

fn run() -> Result<()> {
    task::block_on(try_run("127.0.0.1:6060"))
}

async fn try_run(addr: impl ToSocketAddrs) -> Result<()> {
    let stream = TcpStream::connect(addr).await?;
    let (reader, mut writer) = (&stream, &stream);
    let mut lines_from_server = BufReader::new(reader).lines().fuse();
    let mut lines_from_stdin = BufReader::new(stdin()).lines().fuse();
    loop {
        select! {
            line = lines_from_server.next().fuse() => match line {
                Some(line) => {
                    println!("{}", line?);
                },
                None => break,
            },
            line = lines_from_stdin.next().fuse() => match line {
                Some(line) => {
                    let line = line?;
                    writer.write_all(line.as_bytes()).await?;
                    writer.write_all(b"\n").await?;

                },
                None => break,
            }
        }
    }
    Ok(())
}