From d1297d6e8342ba16da2c173361148edb4293d6f2 Mon Sep 17 00:00:00 2001 From: quak Date: Tue, 29 Apr 2025 10:46:08 +0200 Subject: [PATCH] (rust) very basic command handler --- rust/Cargo.toml | 1 + rust/src/main.rs | 64 +++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/rust/Cargo.toml b/rust/Cargo.toml index 1dc57fb..f380c67 100644 --- a/rust/Cargo.toml +++ b/rust/Cargo.toml @@ -6,4 +6,5 @@ edition = "2021" [dependencies] clap = { version = "4.5.0", features = ["derive"] } dirs = "5.0.1" +ctrlc = "3.4" diff --git a/rust/src/main.rs b/rust/src/main.rs index 483cd67..0a6be73 100644 --- a/rust/src/main.rs +++ b/rust/src/main.rs @@ -1,8 +1,70 @@ #![allow(dead_code, unused)] -use std::io::{Error, Result}; +use std::{ + io::{stdin, stdout, Error, Result, Write}, + sync::{ + atomic::{AtomicBool, Ordering}, Arc + }, +}; fn main() -> Result<()> { + let running = Arc::new(AtomicBool::new(true)); + let signal_running = running.clone(); + let mut input: String = String::new(); + let mut length: usize; + let mut tokens: Vec<&str>; + + ctrlc::set_handler(move || { + signal_running.swap(false, Ordering::SeqCst); + }); + + while running.load(Ordering::SeqCst) { + print!("> "); + _ = stdout().flush(); + length = match stdin().read_line(&mut input) { + Ok(value) => value, + Err(error) => { + println!("\nError: {:#?}\n", error); + continue; + } + }; + + if 0 == length { + continue; + } + + input = input.trim_matches('\n').to_owned(); + tokens = input.splitn(2,[' ']).collect(); + if tokens.len() != 2 { + continue; + } + + let cmd = tokens.remove(0); + let data = tokens.remove(0); + + if cmd == "raw" { + println!("{:02x?}", data.as_bytes()); + } else if cmd == "str" { + println!("{}", data); + } + + input.clear(); + } + Ok(()) } +// NOTE: not required, but might be fun to implement at some point +// fn tokenise(input: &str, separator: Vec<&str>) -> Vec { +// let separator = separator.join(""); +// let mut tokens: Vec = Vec::new(); +// let mut quoted = false; +// +// for char in input.chars() { +// input.len +// if separator.contains(char) { +// } +// } +// +// tokens +// }