use async_std::{ fs, io::BufReader, net::{TcpListener, TcpStream, ToSocketAddrs}, prelude::*, task, }; type Result = std::result::Result>; pub fn start_server(addr: impl ToSocketAddrs) -> Result<()> { let fut = listen(addr); task::block_on(fut) } async fn listen(addr: impl ToSocketAddrs) -> Result<()> { let listener = TcpListener::bind(addr).await?; let mut incoming = listener.incoming(); while let Some(stream) = incoming.next().await { let stream = stream?; println!("-> Connection from: {}", stream.peer_addr()?); task::spawn(client_loop(stream)); } Ok(()) } async fn client_loop(mut stream: TcpStream) -> Result<()> { let reader = BufReader::new(&stream); let mut lines = reader.lines(); if let Some(Ok(line)) = lines.next().await { println!("-> client sent: {:?}", line); respond(&mut stream, &line).await?; } Ok(()) } async fn respond(stream: &mut TcpStream, selector: &str) -> Result<()> { let mut response = format!("iYou sent: {}\r\n", selector); let mut dir = fs::read_dir(".").await?; while let Some(Ok(entry)) = dir.next().await { response.push_str(&format!( "1{}\t/{}\tlocalhost\t7070\r\n", entry.file_name().into_string().unwrap(), entry.file_name().into_string().unwrap(), )); } stream.write_all(response.as_bytes()).await?; Ok(()) }