From d80cc79f572a94fd4fd83fced4bde420ac4bb77c Mon Sep 17 00:00:00 2001 From: Pavel Lutskov Date: Mon, 20 Dec 2021 21:13:34 +0100 Subject: [PATCH] Use destructuring for arg splitting in engine ui This make the arg handling code less awkward. --- rs/src/ui.rs | 58 +++++++++++++++++++++++++++++----------------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/rs/src/ui.rs b/rs/src/ui.rs index 2be95de..9e18937 100644 --- a/rs/src/ui.rs +++ b/rs/src/ui.rs @@ -97,42 +97,48 @@ impl Ui { } } fn get_state(&self, args: &[&str]) -> Result { - if !args.is_empty() { - Err("get_state takes no args".to_owned()) - } else { + if let [] = args { let result = format!("{}", self.board); Ok(result) + } else { + Err("get_state takes no args".to_owned()) } } fn get_moves(&self, args: &[&str]) -> Result { - if args.len() != 1 { - return Err("get_moves takes 1 arg".to_owned()); - }; - let position = board::Position::parse(args[0]) - .map_err(|_| format!("Error parsing position {}", args[0]))?; - match self.board.get_legal_moves(&position) { - None => { - let error = format!("No moves possible from {}", position); - Err(error) - } - Some(positions) => { - Ok(positions.iter().map(|pos| format!("{}", pos)).collect()) + if let [position_str] = args { + let position = + board::Position::parse(position_str).map_err(|_| { + format!("Error parsing position {}", position_str) + })?; + match self.board.get_legal_moves(&position) { + None => { + let error = format!("No moves possible from {}", position); + Err(error) + } + Some(positions) => Ok(positions + .iter() + .map(|pos| format!("{}", pos)) + .collect()), } + } else { + Err("get_moves takes 1 arg".to_owned()) } } fn make_move(&mut self, args: &[&str]) -> Result { - if args.len() != 2 { - return Err("make_move takes 2 args".to_owned()); - }; - let source = board::Position::parse(args[0]) - .map_err(|_| format!("Error parsing source {}", args[0]))?; - let target = board::Position::parse(args[1]) - .map_err(|_| format!("Error parsing target {}", args[1]))?; - match self.board.make_move(&source, target) { - Err(()) => { - Err(format!("Move not possible {}-{}", args[0], args[1])) + if let [source_str, target_str] = args { + let source = board::Position::parse(source_str) + .map_err(|_| format!("Error parsing source {}", source_str))?; + let target = board::Position::parse(target_str) + .map_err(|_| format!("Error parsing target {}", target_str))?; + match self.board.make_move(&source, target) { + Err(()) => Err(format!( + "Move not possible {}-{}", + source_str, target_str + )), + Ok(()) => Ok(self.board.to_string()), } - Ok(()) => Ok(self.board.to_string()), + } else { + Err("make_move takes 2 args".to_owned()) } } fn handle_command(&mut self, s: &str) -> Result {