From f5a00e9090b9d81936137c3fc676cfd0ad25430c Mon Sep 17 00:00:00 2001 From: Justin Wernick Date: Fri, 17 Mar 2023 11:10:53 +0200 Subject: Use shlex to split shell arguments --- src/main.rs | 4 ++-- src/parser.rs | 21 +++++++++++++++++++-- 2 files changed, 21 insertions(+), 4 deletions(-) (limited to 'src') diff --git a/src/main.rs b/src/main.rs index 50f5127..bcbfe1c 100644 --- a/src/main.rs +++ b/src/main.rs @@ -51,8 +51,8 @@ fn run_command(user_input: String) -> Result, ShackleError> return Ok(ControlFlow::Break(())); } Ok(ShackleCommand::GitInit(GitInitArgs { repo_name })) => { - git::init(&repo_name)?; // TODO should report this error differently - println!("Successfully created {}.git", repo_name); + git::init(&repo_name)?; + println!("Successfully created \"{}.git\"", repo_name); } Ok(ShackleCommand::GitUploadPack(upload_pack_args)) => { let mut command = Command::new("git-upload-pack"); diff --git a/src/parser.rs b/src/parser.rs index 59dc7d8..89e0d76 100644 --- a/src/parser.rs +++ b/src/parser.rs @@ -1,5 +1,6 @@ use clap::{Parser, Subcommand}; use std::str::FromStr; +use thiserror::Error; #[derive(Parser, Clone, Debug, PartialEq, Eq)] #[command(name = "")] @@ -44,8 +45,16 @@ pub struct GitReceivePackArgs { pub directory: String, } +#[derive(Error, Debug)] +pub enum ParserError { + #[error(transparent)] + ClapError(#[from] clap::error::Error), + #[error("`{0}`")] + LexerError(String), +} + impl FromStr for ShackleCommand { - type Err = clap::error::Error; + type Err = ParserError; fn from_str(s: &str) -> Result { let trimmed = s.trim(); @@ -54,7 +63,15 @@ impl FromStr for ShackleCommand { } else if trimmed.len() == 0 { Ok(ShackleCommand::Whitespace) } else { - ShackleCommand::try_parse_from([""].into_iter().chain(trimmed.split_whitespace())) + 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) + } + } } } } -- cgit v1.2.3