use crate::error::ShellError; pub fn parse_line(line: &str) -> Result<(&str, Vec), ShellError> { let (keyword, unparsed_args) = line.split_once(' ').unwrap_or((line, "")); if let Some(args) = shlex::split(unparsed_args) { Ok((keyword, args)) } else { Err(ShellError::MalformedArgs(unparsed_args.to_string())) } } #[cfg(test)] mod tests { use super::*; #[test] fn test_parse_single() { assert_eq!(parse_line("keyword"), Ok(("keyword", vec![]))) } #[test] fn test_parse_multiple() { assert_eq!( parse_line("keyword arg1 arg2"), Ok(("keyword", vec!["arg1".to_string(), "arg2".to_string()])) ) } #[test] fn test_parse_complex() { assert_eq!( parse_line("keyword 'this is arg 1' arg2 \"arg3 \""), Ok(( "keyword", vec![ "this is arg 1".to_string(), "arg2".to_string(), "arg3 ".to_string() ] )) ) } #[test] fn test_parse_malformed() { assert_eq!( parse_line("keyword \"malformed"), Err(ShellError::MalformedArgs("keyword \"malformed".to_string())) ) } }