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> {
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<String, String> {
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]))?;
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())
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<String, String> {
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]))?;
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 {}-{}", args[0], args[1]))
}
Err(()) => Err(format!(
"Move not possible {}-{}",
source_str, target_str
)),
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> {
let mut cmd = s.split(',');