From 5a557e63c2e7543efd14a2b1022f8d2aa4c363ea Mon Sep 17 00:00:00 2001 From: PinStraw Date: Fri, 4 Apr 2025 15:37:24 -0400 Subject: [PATCH] adding command looping and bypass command --- Makefile | 16 ++++++++++ main.rs | 95 ++++++++++++++++++++++++++++++++++++-------------------- 2 files changed, 78 insertions(+), 33 deletions(-) create mode 100644 Makefile diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..0270796 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +LIBRARIES = -lreadline +RELEASE_ARGS = -DRELEASEBUILD +SOURCES = ./msh.c +OUTPUT_DIR = ./bin +OUTPUT_BIN = ${OUTPUT_DIR}/PROG +OUTPUT = -o ${OUTPUT_BIN} + +build: + RUSTFLAGS='-C target-feature=+crt-static' cargo build + +debug: + cargo build + +install: + mv ${OUTPUT_BIN:PROG=mash} /usr/sbin/blah + diff --git a/main.rs b/main.rs index 21d8cbd..669f64e 100644 --- a/main.rs +++ b/main.rs @@ -1,7 +1,8 @@ +use std::io::Write; use std::process::{Command, Output}; use std::io::Result as IoResult; -use inquire::{Text, validator::{Validation}}; -use inquire::{error::InquireError, Select}; +use inquire::{Text, validator::Validation}; +use inquire::Select; use inquire::ui::{RenderConfig, Styled}; use regex::Regex; @@ -25,15 +26,22 @@ fn execute_command(command: &str) -> IoResult { } } +fn prompt(name:&str) -> String { + let mut line = String::new(); + print!("{}", name); + std::io::stdout().flush().unwrap(); + std::io::stdin().read_line(&mut line).expect("Error: Could not read a line"); + + return line.trim().to_string() +} + fn main() { - let prompt_gen_command = "echo -n \"[${USER}@${HOSTNAME} ${PWD##*/}]$\""; - let prompt_gen = match execute_command(&prompt_gen_command) { - Ok(output) => output, - Err(_) => return - }; + let prompt_gen_command = "echo -n \"r-[${USER}@${HOSTNAME} ${PWD##*/}]$ \""; let mut empty_render_config: RenderConfig = RenderConfig::default(); empty_render_config = empty_render_config.with_prompt_prefix(Styled::new("")); + empty_render_config = empty_render_config.with_answered_prompt_prefix(Styled::new("")); + empty_render_config = empty_render_config.with_canceled_prompt_indicator(Styled::new("")); let re = Regex::new(r"CHG[0-9]{6}$").unwrap(); let options: Vec<&str> = vec!["File change", "Package Update", "Package Removal", @@ -47,36 +55,57 @@ fn main() { Ok(Validation::Invalid("Invalid change request (e.g: CHGXXXXXX)".into())) }; - let validator = |input: &str| if input.chars().count() > 140 { - Ok(Validation::Invalid("You're only allowed 140 characters.".into())) - } else if input.chars().count() == 0 { - Ok(Validation::Invalid("".into())) - } else { - Ok(Validation::Valid) - }; - - let prompt_command = match Text::new(&prompt_gen) - .with_validator(validator) - .with_render_config(empty_render_config) - .prompt() { - Ok(input) => input, - Err(_) => { - eprintln!("Failed to get system input."); - return; - } + let mut bypass_change = false; + loop { + let prompt_command = match execute_command(&prompt_gen_command) { + Ok(output) => { + let prompt_output = prompt(&output); + if prompt_output.chars().count() == 0 { + continue; + } else if prompt_output.starts_with("runme ") || prompt_output == "runme" { + bypass_change = true; + if prompt_output.len() > 6 { + match execute_command(prompt_output.split_at(6).1) { + Ok(output) => print!("{}", output), + Err(e) => eprintln!("Command failed: {}", e), + } + } + continue; + } else { + prompt_output + } + }, + Err(_) => return }; - let _ = Text::new("(e.g. CHGXXXXXX) Enter change request: ").with_validator(change_validator).prompt(); + if !bypass_change { + let change_request = match Text::new("(e.g. CHGXXXXXX) Enter change request: ") + .with_validator(change_validator.clone()) + .prompt() { + Ok(input) => input, + Err(_) => return, + }; + println!("Change request validated: {}", change_request); - let ans: Result<&str, InquireError> = Select::new("Change Type?", options).prompt(); + let ans = Select::new("Change Type?", options.clone()) + .with_render_config(empty_render_config.clone()) + .prompt(); - match ans { - Ok(_) => { - match execute_command(&prompt_command) { - Ok(output) => print!("{}", output), - Err(e) => eprintln!("Command failed: {}", e), + match ans { + Ok(selected_option) => { + println!("Selected option: {}", selected_option); + match execute_command(&prompt_command) { + Ok(output) => print!("{}", output), + Err(e) => eprintln!("Command failed: {}", e), + } + } + Err(_) => println!("not running command..."), } - }, - Err(_) => println!("not running command..."), + } else { + match execute_command(&prompt_command) { + Ok(output) => print!("{}", output), + Err(e) => eprintln!("Command failed: {}", e) + } + } } }