adding command looping and bypass command

This commit is contained in:
PinStraw
2025-04-04 15:37:24 -04:00
parent 5f95c95370
commit 5a557e63c2
2 changed files with 78 additions and 33 deletions

16
Makefile Normal file
View File

@@ -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

95
main.rs
View File

@@ -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<String> {
}
}
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)
}
}
}
}