From 3b30a5b69999b439f679599826241292be01c05d Mon Sep 17 00:00:00 2001 From: akglaza Date: Thu, 11 Jun 2026 17:51:27 -0400 Subject: [PATCH 1/7] Write function for printing errors to STDOUT or STDERR depending if TTY detected. --- src/lib.rs | 1 + src/logger.rs | 25 +++++++++++++++++++++++++ 2 files changed, 26 insertions(+) create mode 100644 src/logger.rs diff --git a/src/lib.rs b/src/lib.rs index 6ac50f2..1ddc85f 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,6 +3,7 @@ pub mod display; pub mod executor; pub mod help; pub mod helper; +pub mod logger; pub mod parser; pub mod request; pub mod runner; diff --git a/src/logger.rs b/src/logger.rs new file mode 100644 index 0000000..99d2fb5 --- /dev/null +++ b/src/logger.rs @@ -0,0 +1,25 @@ +use std::{ + fmt::Arguments, + io::{self, IsTerminal}, +}; + +/// Prints a formatted error message to std out if it's a terminal, +/// or stderr if it is being redirected (e.g., piped to a file). +pub fn print_error(args: Arguments) { + let stdin = io::stdin(); + if stdin.is_terminal() { + println!("{}", args); + } else { + eprintln!("{}", args); + } +} + +/// Helper macro to mimic standard print macro syntax +/// Prints a formatted error message to stdout if it's a terminal, +/// or stderr if it is being redirected (e.g., piped to a file). +#[macro_export] +macro_rules! logerror { + ($($arg:tt)*) => { + $crate::logger::print_error(format_args!($($arg)*)) + }; +} From 9fff2eea82326ce24fed6cc593fd040407e069fa Mon Sep 17 00:00:00 2001 From: akglaza Date: Thu, 11 Jun 2026 17:52:02 -0400 Subject: [PATCH 2/7] Replace println and eprintln macros with logerror macro when printing an error. --- src/main.rs | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/src/main.rs b/src/main.rs index cb08926..7c4d4e4 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,6 +3,7 @@ use std::path::PathBuf; use reqsh::builtin::{ControlFlow, handle}; use reqsh::help::help_text; +use reqsh::logerror; use reqsh::parser::{Parsed, parse}; use rustyline::error::ReadlineError; use rustyline::history::FileHistory; @@ -59,7 +60,7 @@ fn shell_loop() { break; } Err(e) => { - println!("{}", e.red().bold()); + logerror!("{}", e.red().bold()); } }, @@ -70,7 +71,7 @@ fn shell_loop() { println!("{}", res); } Err(e) => { - println!("{}", e.red().bold()); + logerror!("{}", e.red().bold()); } } } @@ -82,7 +83,7 @@ fn shell_loop() { }, Err(e) => { - println!("{}", e.red().bold()); + logerror!("{}", e.red().bold()); } } } @@ -96,7 +97,7 @@ fn shell_loop() { } Err(err) => { - println!("Error: {:?}", err); + logerror!("Error: {:?}", err); break; } } @@ -132,7 +133,7 @@ fn collect_input(rl: &mut Editor, first_line: String) } Err(err) => { - println!("Error: {:?}", err); + logerror!("Error: {:?}", err); buffer.clear(); continue; } @@ -159,14 +160,14 @@ fn main() { } [unknown] => { - eprintln!("Unknown argument: {}", unknown); - eprintln!("Try 'reqsh --help'"); + logerror!("Unknown argument: {}", unknown); + logerror!("Try 'reqsh --help'"); std::process::exit(1); } _ => { - eprintln!("Too many arguments"); - eprintln!("Try 'reqsh --help'"); + logerror!("Too many arguments"); + logerror!("Try 'reqsh --help'"); std::process::exit(1); } } From 97a924436a0d3fe1f13489e837f65b679529b90f Mon Sep 17 00:00:00 2001 From: akglaza Date: Thu, 11 Jun 2026 17:52:33 -0400 Subject: [PATCH 3/7] allow token_match (Methods) to be lower/upper/mixed case. --- src/parser.rs | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/src/parser.rs b/src/parser.rs index 8ac98fc..0db700c 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -13,8 +13,13 @@ pub fn parse(input: String) -> Result { let first_line = input.lines().next().unwrap(); let tokens: Vec<&str> = first_line.split_whitespace().collect(); - match tokens[0] { - "GET" | "POST" | "PUT" | "DELETE" => { + if tokens.is_empty() { + return Err("No command provided".to_string()); + } + + let token_match = tokens[0].to_lowercase(); + match token_match.as_str() { + "get" | "post" | "put" | "delete" => { let result = parse_request(input)?; Ok(Parsed::Request(result)) } @@ -27,7 +32,7 @@ pub fn parse(input: String) -> Result { "exit" => Ok(Parsed::Exit), - _ => Err(format!("Reference Error: {} not defined", { tokens[0] })), + _ => Err(format!("Reference Error: {} not defined", tokens[0])), } } From 6252f4ba6d513cb530810ec5b683c64ed9dd98bf Mon Sep 17 00:00:00 2001 From: akglaza Date: Thu, 11 Jun 2026 17:52:57 -0400 Subject: [PATCH 4/7] Not everyone has a 10000 line monitor, clean up some whitespace when printing usage. --- src/help.rs | 12 ------------ 1 file changed, 12 deletions(-) diff --git a/src/help.rs b/src/help.rs index 4d8ef4d..2cf6ff5 100644 --- a/src/help.rs +++ b/src/help.rs @@ -4,37 +4,26 @@ pub fn help_text() -> String { format!( " {} - {} - {}: reqsh - {}: {} Show help {} Show version - {} - {}: {} [Headers] - [Body] ::send - {}: GET, POST, PUT, DELETE - {}: : param: = - {}: raw, json - {} - {}: base header @@ -50,7 +39,6 @@ pub fn help_text() -> String { rerun help exit - {} ", "reqsh help".bold().cyan(), From 83dbfc66dd4d8650f34aa601d4cfd32cd03528d2 Mon Sep 17 00:00:00 2001 From: akglaza Date: Thu, 11 Jun 2026 17:53:08 -0400 Subject: [PATCH 5/7] Update version && author --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index c16564a..4438d46 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -907,7 +907,7 @@ dependencies = [ [[package]] name = "reqsh" -version = "0.1.3" +version = "0.2.0" dependencies = [ "colored", "dirs", diff --git a/Cargo.toml b/Cargo.toml index fa6f81a..58fcce1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "reqsh" -version = "0.1.3" +version = "0.2.0" edition = "2024" license = "MIT" -authors = ["Harshil Gupta"] +authors = ["Harshil Gupta", "Aaron K. Glaza "] description = "Interactive HTTP shell for API workflows" repository = "https://github.com/hars-21/reqsh" readme = "README.md" From 94ca9e6733bacaeb9981275d4ba4e2d05059c9df Mon Sep 17 00:00:00 2001 From: akglaza Date: Fri, 12 Jun 2026 10:07:40 -0400 Subject: [PATCH 6/7] Revert Cargo.toml metadata changes. --- Cargo.lock | 2 +- Cargo.toml | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4438d46..c16564a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -907,7 +907,7 @@ dependencies = [ [[package]] name = "reqsh" -version = "0.2.0" +version = "0.1.3" dependencies = [ "colored", "dirs", diff --git a/Cargo.toml b/Cargo.toml index 58fcce1..fa6f81a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,9 +1,9 @@ [package] name = "reqsh" -version = "0.2.0" +version = "0.1.3" edition = "2024" license = "MIT" -authors = ["Harshil Gupta", "Aaron K. Glaza "] +authors = ["Harshil Gupta"] description = "Interactive HTTP shell for API workflows" repository = "https://github.com/hars-21/reqsh" readme = "README.md" From c06fb6e67bcdcca3e3e32218a5eda2fe10d1b175 Mon Sep 17 00:00:00 2001 From: akglaza Date: Fri, 12 Jun 2026 12:17:56 -0400 Subject: [PATCH 7/7] Replace logger module with eprintln!() macro. --- src/lib.rs | 1 - src/logger.rs | 25 ------------------------- src/main.rs | 19 +++++++++---------- 3 files changed, 9 insertions(+), 36 deletions(-) delete mode 100644 src/logger.rs diff --git a/src/lib.rs b/src/lib.rs index 1ddc85f..6ac50f2 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -3,7 +3,6 @@ pub mod display; pub mod executor; pub mod help; pub mod helper; -pub mod logger; pub mod parser; pub mod request; pub mod runner; diff --git a/src/logger.rs b/src/logger.rs deleted file mode 100644 index 99d2fb5..0000000 --- a/src/logger.rs +++ /dev/null @@ -1,25 +0,0 @@ -use std::{ - fmt::Arguments, - io::{self, IsTerminal}, -}; - -/// Prints a formatted error message to std out if it's a terminal, -/// or stderr if it is being redirected (e.g., piped to a file). -pub fn print_error(args: Arguments) { - let stdin = io::stdin(); - if stdin.is_terminal() { - println!("{}", args); - } else { - eprintln!("{}", args); - } -} - -/// Helper macro to mimic standard print macro syntax -/// Prints a formatted error message to stdout if it's a terminal, -/// or stderr if it is being redirected (e.g., piped to a file). -#[macro_export] -macro_rules! logerror { - ($($arg:tt)*) => { - $crate::logger::print_error(format_args!($($arg)*)) - }; -} diff --git a/src/main.rs b/src/main.rs index 7c4d4e4..4423343 100644 --- a/src/main.rs +++ b/src/main.rs @@ -3,7 +3,6 @@ use std::path::PathBuf; use reqsh::builtin::{ControlFlow, handle}; use reqsh::help::help_text; -use reqsh::logerror; use reqsh::parser::{Parsed, parse}; use rustyline::error::ReadlineError; use rustyline::history::FileHistory; @@ -60,7 +59,7 @@ fn shell_loop() { break; } Err(e) => { - logerror!("{}", e.red().bold()); + eprintln!("{}", e.red().bold()); } }, @@ -71,7 +70,7 @@ fn shell_loop() { println!("{}", res); } Err(e) => { - logerror!("{}", e.red().bold()); + eprintln!("{}", e.red().bold()); } } } @@ -83,7 +82,7 @@ fn shell_loop() { }, Err(e) => { - logerror!("{}", e.red().bold()); + eprintln!("{}", e.red().bold()); } } } @@ -97,7 +96,7 @@ fn shell_loop() { } Err(err) => { - logerror!("Error: {:?}", err); + eprintln!("Error: {:?}", err); break; } } @@ -133,7 +132,7 @@ fn collect_input(rl: &mut Editor, first_line: String) } Err(err) => { - logerror!("Error: {:?}", err); + eprintln!("Error: {:?}", err); buffer.clear(); continue; } @@ -160,14 +159,14 @@ fn main() { } [unknown] => { - logerror!("Unknown argument: {}", unknown); - logerror!("Try 'reqsh --help'"); + eprintln!("Unknown argument: {}", unknown); + eprintln!("Try 'reqsh --help'"); std::process::exit(1); } _ => { - logerror!("Too many arguments"); - logerror!("Try 'reqsh --help'"); + eprintln!("Too many arguments"); + eprintln!("Try 'reqsh --help'"); std::process::exit(1); } }