interface.rs 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. use std::io::{self, BufRead};
  2. use std::sync::mpsc::{Receiver, Sender};
  3. use std::process::exit;
  4. use engine::{EngineMsg, InterfaceMsg};
  5. use game::{Game};
  6. use std::fs::File;
  7. use std::io::Write;
  8. use std::cell::RefCell;
  9. thread_local!(static debug_log: RefCell<File> = RefCell::new(File::create("debug.log").unwrap()));
  10. pub fn run(r: Receiver<InterfaceMsg>, s: Sender<EngineMsg>) {
  11. //unsafe { debug_log = Box::new(File::open("debug.log").unwrap()); }
  12. let stdin = io::stdin();
  13. for line_m in stdin.lock().lines() {
  14. let line = line_m.unwrap();
  15. debug_log.with(|fc|
  16. writeln!(fc.borrow_mut(), "received line: {}", line)
  17. );
  18. let split = line.split_whitespace().collect::<Vec<&str>>();
  19. run_command(split, &r, &s);
  20. }
  21. }
  22. fn run_command(mut cmd: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  23. if cmd.len() > 0 {
  24. let command = cmd[0];
  25. cmd.drain(0..1);
  26. match command {
  27. "uci" => cmd_uci(cmd),
  28. "isready" => cmd_isready(cmd),
  29. "position" => cmd_position(cmd, r, s),
  30. "go" => cmd_go(cmd, r, s),
  31. "ucinewgame" => cmd_newgame(cmd, r, s),
  32. "quit" | "exit" => cmd_quit(cmd, r, s),
  33. cmd => { println!("unknown command: {}", cmd); }
  34. }
  35. }
  36. }
  37. fn cmd_uci(_args: Vec<&str>) {
  38. println!("id name bishop 1.0");
  39. println!("id author Geile Siech");
  40. println!("uciok");
  41. }
  42. fn cmd_isready(_args: Vec<&str>) {
  43. println!("readyok");
  44. }
  45. fn cmd_position(mut args: Vec<&str>, r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  46. let position = args[0];
  47. args.drain(0..1);
  48. let mut game = Game::default();
  49. if position == "startpos" {
  50. }
  51. else if position == "fen" {
  52. let fen_parts: Vec<String> = Vec::from(&args[0..6]).into_iter().map(|x| x.to_owned() + " ").collect::<Vec<String>>();
  53. debug_log.with(|fc|
  54. writeln!(fc.borrow_mut(), "fen string is: {:?}", fen_parts)
  55. );
  56. // "3N4/5P2/2K1P1pP/p2PNn2/1p3r2/2P4P/4k2B/8 w - - 0 1"
  57. }
  58. s.send(EngineMsg::SetBoard(game)).unwrap();
  59. }
  60. fn cmd_go(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  61. s.send(EngineMsg::Search(3)).unwrap();
  62. }
  63. fn cmd_newgame(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, s: &Sender<EngineMsg>) {
  64. s.send(EngineMsg::NewGame).unwrap();
  65. }
  66. fn cmd_quit(_args: Vec<&str>, _r: &Receiver<InterfaceMsg>, _s: &Sender<EngineMsg>) {
  67. exit(0);
  68. }