From bef5368aecd6d466d04003c6c0fc48cae270f7f1 Mon Sep 17 00:00:00 2001 From: szymon Date: Sun, 16 Aug 2026 20:13:18 +0200 Subject: [PATCH] feat: add args parsing to cli client --- src/bin/client.rs | 88 ++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 72 insertions(+), 16 deletions(-) diff --git a/src/bin/client.rs b/src/bin/client.rs index 7e6f446..fea79ff 100644 --- a/src/bin/client.rs +++ b/src/bin/client.rs @@ -1,6 +1,42 @@ -use std::io; +use std::{fmt::Display, io}; use checkers::network::client::Client; +use log::{error, info}; + +const QUIT_COMMAND: &str = "/quit"; +const HELP_COMMAND: &str = "/help"; +const SEND_COMMAND: &str = "/send"; +const READY_COMMAND: &str = "/ready"; + +enum CliCommands { + Quit, + Help, + Send, + Ready, +} + +#[derive(Debug, PartialEq)] +struct UnknownCommandError; + +impl Display for UnknownCommandError { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + write!(f, "Unknown command!") + } +} + +impl TryFrom<&str> for CliCommands { + type Error = UnknownCommandError; + + fn try_from(value: &str) -> Result { + match value { + QUIT_COMMAND => Ok(CliCommands::Quit), + HELP_COMMAND => Ok(CliCommands::Help), + SEND_COMMAND => Ok(CliCommands::Send), + READY_COMMAND => Ok(CliCommands::Ready), + _ => Err(UnknownCommandError), + } + } +} #[tokio::main] async fn main() -> Result<(), Box> { @@ -11,28 +47,48 @@ async fn main() -> Result<(), Box> { return Ok(()); }; + let help_msg: String = format!( + "\n┌────Help──── +│\t {} - quit +│\t {} - show this message +│\t {} - message the server you're ready +│\t {} - send text message to the server + ", + QUIT_COMMAND, HELP_COMMAND, READY_COMMAND, SEND_COMMAND, + ); + client.update(); - println!("=== Write to stding to send text messages ==="); - println!("Write /close to leave"); + info!("====== Type /help for help ========"); let mut buffer = String::new(); loop { io::stdin().read_line(&mut buffer)?; - if buffer == "/close\n" { - break; - } + let words: Vec<&str> = buffer.split_whitespace().collect(); + let cmd = words[0]; + let mut args: String = words[1..].iter().map(|s| s.to_string() + " ").collect(); + args = args.trim().to_string(); - if buffer == "/test\n" { - buffer = String::from("A").repeat(1024 * 1024 * 2); + match CliCommands::try_from(cmd) { + Ok(cmd) => match cmd { + CliCommands::Quit => { + info!("Bye bye"); + break; + } + CliCommands::Help => { + info!("{}", help_msg); + buffer.clear(); + } + CliCommands::Ready => { + client.signal_readiness().await; + buffer.clear(); + } + CliCommands::Send => { + client.send_text_message(args).await; + buffer.clear(); + } + }, + Err(e) => error!("{}", e), } - - if buffer == "/ready\n" { - buffer.clear(); - client.signal_readiness().await; - continue; - } - - client.send_text_message(buffer.clone()).await; buffer.clear(); }