summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJustin Wernick <justin@worthe-it.co.za>2023-04-11 20:45:11 +0200
committerJustin Wernick <justin@worthe-it.co.za>2023-04-11 20:45:11 +0200
commite6ed91d0efab436c8a1ca4b6f701b6a9a4d96ccd (patch)
treed246e448c6cbd86df795452c220f39723d09a714
parent972319c1811e1a9c4f491a03ba92ea5a624cca5e (diff)
Refactoring, move where whitespace is handled
-rw-r--r--src/lib.rs3
-rw-r--r--src/main.rs7
-rw-r--r--src/parser.rs28
3 files changed, 12 insertions, 26 deletions
diff --git a/src/lib.rs b/src/lib.rs
index 134ba97..5fbea79 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -7,12 +7,11 @@ use rustyline::error::ReadlineError;
use std::{io, ops::ControlFlow};
use thiserror::Error;
-pub fn run_command(user_input: String) -> Result<ControlFlow<(), ()>, ShackleError> {
+pub fn run_command(user_input: &str) -> Result<ControlFlow<(), ()>, ShackleError> {
match user_input.parse::<ShackleCommand>() {
Err(parse_error) => {
println!("{}", parse_error);
}
- Ok(ShackleCommand::Whitespace) => {}
Ok(ShackleCommand::Exit) => {
return Ok(ControlFlow::Break(()));
}
diff --git a/src/main.rs b/src/main.rs
index acb6df2..99b755d 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -22,7 +22,7 @@ fn main_inner() -> Result<(), ShackleError> {
let args = Args::parse();
match args.command {
Some(user_input) => {
- run_command(user_input)?;
+ run_command(&user_input)?;
}
None => {
run_interactive_loop()?;
@@ -36,9 +36,10 @@ fn run_interactive_loop() -> Result<(), ShackleError> {
let mut rl = DefaultEditor::new()?;
loop {
let readline = rl.readline("> ");
- match readline {
+ match readline.as_ref().map(|user_input| user_input.trim()) {
+ Ok("") => {}
Ok(user_input) => {
- rl.add_history_entry(user_input.as_str())?;
+ rl.add_history_entry(user_input)?;
match run_command(user_input) {
Ok(control_flow) => {
if control_flow.is_break() {
diff --git a/src/parser.rs b/src/parser.rs
index 3a7d129..38b88f3 100644
--- a/src/parser.rs
+++ b/src/parser.rs
@@ -8,8 +8,6 @@ use thiserror::Error;
#[derive(Parser, Clone, Debug, PartialEq, Eq)]
#[command(name = "")]
pub enum ShackleCommand {
- #[command(skip)]
- Whitespace,
Exit,
/// List all repositories available
List,
@@ -80,17 +78,13 @@ impl FromStr for ShackleCommand {
fn from_str(s: &str) -> Result<Self, Self::Err> {
let trimmed = s.trim();
- if trimmed.len() == 0 {
- Ok(ShackleCommand::Whitespace)
- } else {
- let lexed = shlex::split(trimmed);
- match lexed {
- None => Err(ParserError::LexerError("Incomplete input".to_string())),
- Some(lexed) => {
- let parsed =
- ShackleCommand::try_parse_from(["".to_owned()].into_iter().chain(lexed))?;
- Ok(parsed)
- }
+ let lexed = shlex::split(trimmed);
+ match lexed {
+ None => Err(ParserError::LexerError("Incomplete input".to_string())),
+ Some(lexed) => {
+ let parsed =
+ ShackleCommand::try_parse_from(["".to_owned()].into_iter().chain(lexed))?;
+ Ok(parsed)
}
}
}
@@ -154,12 +148,4 @@ mod test {
})
);
}
-
- #[test]
- fn it_parses_whitespace_correctly() {
- assert_eq!(
- " ".parse::<ShackleCommand>().unwrap(),
- ShackleCommand::Whitespace
- );
- }
}