diff options
author | Akshay <[email protected]> | 2020-08-02 12:56:07 +0100 |
---|---|---|
committer | Akshay <[email protected]> | 2020-08-02 12:56:07 +0100 |
commit | 83cba9dae6e4cc6a348ef0b9ee7e2c7f747409f5 (patch) | |
tree | 601f8a87a8f41af3a236bf77c404537afbf0321c /src | |
parent | 76bdf45721d597922962e003568dcfdbcb548e63 (diff) |
simplify command parsing logic
Diffstat (limited to 'src')
-rw-r--r-- | src/command.rs | 66 |
1 files changed, 30 insertions, 36 deletions
diff --git a/src/command.rs b/src/command.rs index 9809718..0ef5121 100644 --- a/src/command.rs +++ b/src/command.rs | |||
@@ -181,32 +181,24 @@ impl Command { | |||
181 | } | 181 | } |
182 | 182 | ||
183 | fn parse_command_name(input: &str) -> Result<(CommandName, &str)> { | 183 | fn parse_command_name(input: &str) -> Result<(CommandName, &str)> { |
184 | let chars = input.trim().chars(); | 184 | let pieces: Vec<&str> = input.trim().splitn(2, ' ').collect(); |
185 | let mut parsed_name = "".to_owned(); | 185 | |
186 | let mut pos = 0; | 186 | let command = pieces.first().unwrap(); |
187 | 187 | let rest = pieces.iter().skip(1).next().map(|&x| x).unwrap_or(""); | |
188 | for c in chars { | 188 | |
189 | pos = pos + 1; | 189 | match command.as_ref() { |
190 | if c == ' ' { | 190 | "add" | "a" => Ok((CommandName::Add, rest)), |
191 | break; | 191 | "add-auto" | "aa" => Ok((CommandName::AddAuto, rest)), |
192 | } | 192 | "delete" | "d" => Ok((CommandName::Delete, rest)), |
193 | 193 | "track-up" | "tup" => Ok((CommandName::TrackUp, rest)), | |
194 | parsed_name.push(c); | 194 | "track-down" | "tdown" => Ok((CommandName::TrackDown, rest)), |
195 | } | 195 | "h" | "?" | "help" => Ok((CommandName::Help, rest)), |
196 | 196 | "mprev" => Ok((CommandName::MonthPrev, "")), | |
197 | match parsed_name.as_ref() { | 197 | "mnext" => Ok((CommandName::MonthNext, "")), |
198 | "add" | "a" => Ok((CommandName::Add, &input[pos..])), | 198 | "quit" | "q" => Ok((CommandName::Quit, "")), |
199 | "add-auto" | "aa" => Ok((CommandName::AddAuto, &input[pos..])), | 199 | "write" | "w" => Ok((CommandName::Write, "")), |
200 | "delete" | "d" => Ok((CommandName::Delete, &input[pos..])), | 200 | "" => Ok((CommandName::Blank, "")), |
201 | "track-up" | "tup" => Ok((CommandName::TrackUp, &input[pos..])), | 201 | c => Err(CommandLineError::InvalidCommand(c.to_string())), |
202 | "track-down" | "tdown" => Ok((CommandName::TrackDown, &input[pos..])), | ||
203 | "h" | "?" | "help" => Ok((CommandName::Help, &input[pos..])), | ||
204 | "mprev" => Ok((CommandName::MonthPrev, &input[pos..])), | ||
205 | "mnext" => Ok((CommandName::MonthNext, &input[pos..])), | ||
206 | "quit" | "q" => Ok((CommandName::Quit, &input[pos..])), | ||
207 | "write" | "w" => Ok((CommandName::Write, &input[pos..])), | ||
208 | "" => Ok((CommandName::Blank, &input[pos..])), | ||
209 | _ => Err(CommandLineError::InvalidCommand(parsed_name)), | ||
210 | } | 202 | } |
211 | } | 203 | } |
212 | 204 | ||
@@ -590,20 +582,22 @@ mod tests { | |||
590 | #[test] | 582 | #[test] |
591 | fn parse_error_not_enough_args() { | 583 | fn parse_error_not_enough_args() { |
592 | let test_cases = [ | 584 | let test_cases = [ |
593 | ("add".to_owned(), "add".to_owned(), 2), | 585 | ("add", "add", 2), |
594 | ("add-auto".to_owned(), "add-auto".to_owned(), 2), | 586 | ("add-auto", "add-auto", 2), |
595 | ("delete".to_owned(), "delete".to_owned(), 1), | 587 | ("delete", "delete", 1), |
596 | ("track-up".to_owned(), "track-up".to_owned(), 1), | 588 | ("track-up", "track-up", 1), |
597 | ("track-down".to_owned(), "track-down".to_owned(), 1), | 589 | ("track-down", "track-down", 1), |
598 | ]; | 590 | ] |
599 | 591 | .iter() | |
600 | for test_case in test_cases.iter() { | 592 | .map(|(a, b, c)| (a.to_owned(), b.to_owned(), c)); |
601 | let result = Command::from_string(&test_case.0); | 593 | |
594 | for test_case in test_cases { | ||
595 | let result = Command::from_string(test_case.0); | ||
602 | 596 | ||
603 | assert!(result.is_err()); | 597 | assert!(result.is_err()); |
604 | assert_eq!( | 598 | assert_eq!( |
605 | result.err().unwrap(), | 599 | result.err().unwrap(), |
606 | CommandLineError::NotEnoughArgs(test_case.1.clone(), test_case.2) | 600 | CommandLineError::NotEnoughArgs(test_case.1.to_string(), *test_case.2) |
607 | ); | 601 | ); |
608 | } | 602 | } |
609 | } | 603 | } |