55
rs/src/ui.rs
55
rs/src/ui.rs
@@ -25,17 +25,47 @@ impl std::fmt::Display for board::Piece {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
trait GridAxisIO: std::fmt::Display
|
||||||
|
where
|
||||||
|
Self: GridAxis,
|
||||||
|
{
|
||||||
|
const ALL_CHARS: [char; 8];
|
||||||
|
fn parse(c: char) -> Result<Self, ()> {
|
||||||
|
let index = Self::ALL_CHARS.iter().position(|p| p == &c).ok_or(())?;
|
||||||
|
Ok(Self::ALL_VALUES[index].clone())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl GridAxisIO for board::Rank {
|
||||||
|
const ALL_CHARS: [char; 8] = ['1', '2', '3', '4', '5', '6', '7', '8'];
|
||||||
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for board::Rank {
|
impl std::fmt::Display for board::Rank {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
const ALL_CHARS: [char; 8] = ['1', '2', '3', '4', '5', '6', '7', '8'];
|
write!(f, "{}", Self::ALL_CHARS[self.get_index() as usize])
|
||||||
write!(f, "{}", ALL_CHARS[self.get_index() as usize])
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl GridAxisIO for board::File {
|
||||||
|
const ALL_CHARS: [char; 8] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
|
||||||
|
}
|
||||||
|
|
||||||
impl std::fmt::Display for board::File {
|
impl std::fmt::Display for board::File {
|
||||||
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
|
||||||
const ALL_CHARS: [char; 8] = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'];
|
write!(f, "{}", Self::ALL_CHARS[self.get_index() as usize])
|
||||||
write!(f, "{}", ALL_CHARS[self.get_index() as usize])
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl board::Position {
|
||||||
|
fn parse(s: &str) -> Result<Self, ()> {
|
||||||
|
let mut chars = s.chars();
|
||||||
|
let file = board::File::parse(chars.next().ok_or(())?)?;
|
||||||
|
let rank = board::Rank::parse(chars.next().ok_or(())?)?;
|
||||||
|
if chars.next().is_none() {
|
||||||
|
Ok(board::Position::new(rank, file))
|
||||||
|
} else {
|
||||||
|
Err(())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -74,6 +104,22 @@ impl Ui {
|
|||||||
Ok(result)
|
Ok(result)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
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]))?;
|
||||||
|
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())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
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(',');
|
||||||
// There will be at least an empty string => otherwise panic
|
// There will be at least an empty string => otherwise panic
|
||||||
@@ -81,6 +127,7 @@ impl Ui {
|
|||||||
let args: Vec<&str> = cmd.collect();
|
let args: Vec<&str> = cmd.collect();
|
||||||
match cmd_type {
|
match cmd_type {
|
||||||
"get_state" => self.get_state(&args),
|
"get_state" => self.get_state(&args),
|
||||||
|
"get_moves" => self.get_moves(&args),
|
||||||
"" => Err("No command given".to_owned()),
|
"" => Err("No command given".to_owned()),
|
||||||
_ => Err("Invalid command".to_owned()),
|
_ => Err("Invalid command".to_owned()),
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user