Use destructuring for arg splitting in engine ui

This make the arg handling code less awkward.
This commit is contained in:
2021-12-20 21:13:34 +01:00
parent a7d3bb3752
commit d80cc79f57

View File

@@ -97,43 +97,49 @@ impl Ui {
} }
} }
fn get_state(&self, args: &[&str]) -> Result<String, String> { fn get_state(&self, args: &[&str]) -> Result<String, String> {
if !args.is_empty() { if let [] = args {
Err("get_state takes no args".to_owned())
} else {
let result = format!("{}", self.board); let result = format!("{}", self.board);
Ok(result) Ok(result)
} else {
Err("get_state takes no args".to_owned())
} }
} }
fn get_moves(&self, args: &[&str]) -> Result<String, String> { fn get_moves(&self, args: &[&str]) -> Result<String, String> {
if args.len() != 1 { if let [position_str] = args {
return Err("get_moves takes 1 arg".to_owned()); let position =
}; board::Position::parse(position_str).map_err(|_| {
let position = board::Position::parse(args[0]) format!("Error parsing position {}", position_str)
.map_err(|_| format!("Error parsing position {}", args[0]))?; })?;
match self.board.get_legal_moves(&position) { match self.board.get_legal_moves(&position) {
None => { None => {
let error = format!("No moves possible from {}", position); let error = format!("No moves possible from {}", position);
Err(error) Err(error)
} }
Some(positions) => { Some(positions) => Ok(positions
Ok(positions.iter().map(|pos| format!("{}", pos)).collect()) .iter()
.map(|pos| format!("{}", pos))
.collect()),
} }
} else {
Err("get_moves takes 1 arg".to_owned())
} }
} }
fn make_move(&mut self, args: &[&str]) -> Result<String, String> { fn make_move(&mut self, args: &[&str]) -> Result<String, String> {
if args.len() != 2 { if let [source_str, target_str] = args {
return Err("make_move takes 2 args".to_owned()); let source = board::Position::parse(source_str)
}; .map_err(|_| format!("Error parsing source {}", source_str))?;
let source = board::Position::parse(args[0]) let target = board::Position::parse(target_str)
.map_err(|_| format!("Error parsing source {}", args[0]))?; .map_err(|_| format!("Error parsing target {}", target_str))?;
let target = board::Position::parse(args[1])
.map_err(|_| format!("Error parsing target {}", args[1]))?;
match self.board.make_move(&source, target) { match self.board.make_move(&source, target) {
Err(()) => { Err(()) => Err(format!(
Err(format!("Move not possible {}-{}", args[0], args[1])) "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<String, String> { fn handle_command(&mut self, s: &str) -> Result<String, String> {
let mut cmd = s.split(','); let mut cmd = s.split(',');