protohackers/problem_03/src/client.rs

57 lines
1.7 KiB
Rust
Raw Normal View History

use tokio::io::{AsyncBufReadExt, AsyncWriteExt, BufReader, BufWriter};
2023-04-27 13:23:56 +00:00
use tokio::net::TcpStream;
use tokio::task;
use tracing::{error, info};
2023-04-27 13:23:56 +00:00
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
tracing_subscriber::fmt::try_init().expect("Tracing was not setup");
let stream = TcpStream::connect("0.0.0.0:1222").await?;
2023-04-27 13:23:56 +00:00
let (reader, writer) = tokio::io::split(stream);
let mut buf_reader = BufReader::new(reader);
let mut writer = BufWriter::new(writer);
2023-04-27 13:23:56 +00:00
let server_handle = task::spawn(async move {
let mut buf = String::new();
2023-04-27 13:23:56 +00:00
loop {
info!("Inside reading lines from server loop");
if let Ok(n) = buf_reader.read_line(&mut buf).await {
2023-04-27 13:23:56 +00:00
if n > 0 {
info!("Receivng from server: {}", buf.trim_end());
2023-04-27 13:23:56 +00:00
} else {
info!("Server is finished sending, break");
return;
2023-04-27 13:23:56 +00:00
}
} else {
error!("Cannot receive");
return;
2023-04-27 13:23:56 +00:00
}
buf.clear();
2023-04-27 13:23:56 +00:00
}
});
let std_handle = tokio::spawn(async move {
let mut stdin_reader = BufReader::new(tokio::io::stdin()).lines();
while let Ok(Some(line)) = stdin_reader.next_line().await {
info!("Received line from stdin: {}", line);
2023-04-27 13:23:56 +00:00
if let Err(_) = writer.write_all(line.as_bytes()).await {
error!("Error reading from std");
2023-04-27 13:23:56 +00:00
break;
}
let _ = writer.write_all(&[b'\n']).await;
let _ = writer.flush().await;
2023-04-27 13:23:56 +00:00
}
});
let _ = server_handle.await;
let _ = std_handle.await;
2023-04-27 13:23:56 +00:00
Ok(())
}