implement moves

This commit is contained in:
Baptiste Fouques 2023-01-12 17:27:17 +01:00
parent 44c0a23252
commit 4cac2dc414
3 changed files with 39 additions and 1 deletions

View File

@ -143,12 +143,29 @@ impl<Fi: BufRead, Fo: Write> UciEngine<Fi, Fo> {
} }
} }
pub fn pull_raw(&mut self) -> Option<String> {
let mut data = String::new();
match self.source.read_line(&mut data) {
Ok(0) => {self.terminate("Chess engine closed connection."); None},
Ok(_) => {info!("↜ {}", data); Some(data.clone())},
Err(reason) => {warn!("Unable to read from engine: {reason}"); None},
}
}
pub fn push(&mut self, command: GuiCommand) { pub fn push(&mut self, command: GuiCommand) {
let command_str = command.to_string(); let command_str = command.to_string();
match self.destination.write(&command_str.as_bytes()){ match self.destination.write(&command_str.as_bytes()){
Ok(n) if n == command_str.len() => info!("→ gui: {command_str} "), Ok(n) if n == command_str.len() => info!("→ gui: {command_str}"),
Ok(n) => warn!("⚠ gui: {command_str} truncated at {n}"), Ok(n) => warn!("⚠ gui: {command_str} truncated at {n}"),
Err(reason) => warn!("Unable to send command {command_str}: {reason}"), Err(reason) => warn!("Unable to send command {command_str}: {reason}"),
} }
} }
pub fn push_raw(&mut self, data: &str){
match self.destination.write(data.as_bytes()) {
Ok(n) if n == data.len() => info!("↝ raw: {data}"),
Ok(n) => warn!("⚠ raw: {data} truncated at {n}"),
Err(reason) => warn!("Unable to send raw {data}: {reason}"),
}
}
} }

View File

@ -1,9 +1,11 @@
extern crate chess_uci; extern crate chess_uci;
use chess::ChessMove;
use chess_uci::*; use chess_uci::*;
use std::process::{Command, Stdio}; use std::process::{Command, Stdio};
use std::io::BufReader; use std::io::BufReader;
use std::str::FromStr;
pub fn main(){ pub fn main(){
env_logger::init(); env_logger::init();
@ -26,4 +28,13 @@ pub fn main(){
println!("Engine: {} \nby: {}", println!("Engine: {} \nby: {}",
if let Some(name) = uci.name() {name} else {"Not defined".to_string()}, if let Some(name) = uci.name() {name} else {"Not defined".to_string()},
if let Some(author) = uci.author() {author} else {"Not defined".to_string()}); if let Some(author) = uci.author() {author} else {"Not defined".to_string()});
uci.new_game();
uci.make_move(ChessMove::from_str("e2e4").expect("error converting e2e4"));
uci.push_raw("d\n");
uci.push_raw("quit\n");
while uci.pull_raw() != None {}
} }

View File

@ -101,10 +101,20 @@ pub fn parse(message: &mut String) -> Result<EngineCommand,&'static str> {
} }
impl fmt::Display for GuiCommand { impl fmt::Display for GuiCommand {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result{
match self { match self {
GuiCommand::Uci => write!(f, "uci\n"), GuiCommand::Uci => write!(f, "uci\n"),
GuiCommand::UciNewGame => write!(f, "ucinewgame\n"), GuiCommand::UciNewGame => write!(f, "ucinewgame\n"),
GuiCommand::Position { position, moves } => {
write!(f, "position {} moves {}\n",
match position { None => "startpos".to_string(),
Some(board) if *board == Board::default() => "startpos".to_string(),
Some(board) =>"fen ".to_string() + &board.to_string()},
join(moves.into_iter().map(|x| if let Action::MakeMove(chessmove) = x
{chessmove.to_string()} else {"".to_string()}), "")
)
}
a => unimplemented!("{:?}", a), a => unimplemented!("{:?}", a),
} }