mirror of
https://github.com/szymon-jozef/checkers.git
synced 2026-10-27 19:20:44 +01:00
feat: add args parsing to cli client
This commit is contained in:
@@ -1,6 +1,42 @@
|
|||||||
use std::io;
|
use std::{fmt::Display, io};
|
||||||
|
|
||||||
use checkers::network::client::Client;
|
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<Self, Self::Error> {
|
||||||
|
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]
|
#[tokio::main]
|
||||||
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
||||||
@@ -11,28 +47,48 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
|
|||||||
return Ok(());
|
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();
|
client.update();
|
||||||
|
|
||||||
println!("=== Write to stding to send text messages ===");
|
info!("====== Type /help for help ========");
|
||||||
println!("Write /close to leave");
|
|
||||||
let mut buffer = String::new();
|
let mut buffer = String::new();
|
||||||
loop {
|
loop {
|
||||||
io::stdin().read_line(&mut buffer)?;
|
io::stdin().read_line(&mut buffer)?;
|
||||||
if buffer == "/close\n" {
|
let words: Vec<&str> = buffer.split_whitespace().collect();
|
||||||
break;
|
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" {
|
match CliCommands::try_from(cmd) {
|
||||||
buffer = String::from("A").repeat(1024 * 1024 * 2);
|
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();
|
buffer.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user