uci parse basics
This commit is contained in:
commit
b2ea4fd2f3
|
@ -0,0 +1 @@
|
||||||
|
/target
|
|
@ -0,0 +1,8 @@
|
||||||
|
# Default ignored files
|
||||||
|
/shelf/
|
||||||
|
/workspace.xml
|
||||||
|
# Editor-based HTTP Client requests
|
||||||
|
/httpRequests/
|
||||||
|
# Datasource local storage ignored files
|
||||||
|
/dataSources/
|
||||||
|
/dataSources.local.xml
|
|
@ -0,0 +1,11 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<module type="CPP_MODULE" version="4">
|
||||||
|
<component name="NewModuleRootManager">
|
||||||
|
<content url="file://$MODULE_DIR$">
|
||||||
|
<sourceFolder url="file://$MODULE_DIR$/src" isTestSource="false" />
|
||||||
|
<excludeFolder url="file://$MODULE_DIR$/target" />
|
||||||
|
</content>
|
||||||
|
<orderEntry type="inheritedJdk" />
|
||||||
|
<orderEntry type="sourceFolder" forTests="false" />
|
||||||
|
</component>
|
||||||
|
</module>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="MarkdownSettingsMigration">
|
||||||
|
<option name="stateVersion" value="1" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="ProjectModuleManager">
|
||||||
|
<modules>
|
||||||
|
<module fileurl="file://$PROJECT_DIR$/.idea/bamboo.iml" filepath="$PROJECT_DIR$/.idea/bamboo.iml" />
|
||||||
|
</modules>
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,6 @@
|
||||||
|
<?xml version="1.0" encoding="UTF-8"?>
|
||||||
|
<project version="4">
|
||||||
|
<component name="VcsDirectoryMappings">
|
||||||
|
<mapping directory="" vcs="Git" />
|
||||||
|
</component>
|
||||||
|
</project>
|
|
@ -0,0 +1,41 @@
|
||||||
|
# This file is automatically @generated by Cargo.
|
||||||
|
# It is not intended for manual editing.
|
||||||
|
version = 3
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "autocfg"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "bamboo"
|
||||||
|
version = "0.1.0"
|
||||||
|
dependencies = [
|
||||||
|
"spin",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "lock_api"
|
||||||
|
version = "0.4.9"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
|
||||||
|
dependencies = [
|
||||||
|
"autocfg",
|
||||||
|
"scopeguard",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "scopeguard"
|
||||||
|
version = "1.1.0"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "spin"
|
||||||
|
version = "0.9.5"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "7dccf47db1b41fa1573ed27ccf5e08e3ca771cb994f776668c5ebda893b248fc"
|
||||||
|
dependencies = [
|
||||||
|
"lock_api",
|
||||||
|
]
|
|
@ -0,0 +1,9 @@
|
||||||
|
[package]
|
||||||
|
name = "bamboo"
|
||||||
|
version = "0.1.0"
|
||||||
|
edition = "2021"
|
||||||
|
|
||||||
|
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
|
||||||
|
|
||||||
|
[dependencies]
|
||||||
|
spin = "0.9.5"
|
|
@ -0,0 +1,36 @@
|
||||||
|
|
||||||
|
uci
|
||||||
|
|
||||||
|
isready
|
||||||
|
|
||||||
|
ucinewgame
|
||||||
|
|
||||||
|
quit
|
||||||
|
|
||||||
|
uci
|
||||||
|
|
||||||
|
isready
|
||||||
|
|
||||||
|
ucinewgame
|
||||||
|
|
||||||
|
quit
|
||||||
|
|
||||||
|
< uci
|
||||||
|
|
||||||
|
> id name Bamboo 1.0
|
||||||
|
id author c0repwn3r
|
||||||
|
uciok
|
||||||
|
|
||||||
|
< isready
|
||||||
|
|
||||||
|
> readyok
|
||||||
|
|
||||||
|
< ucinewgame
|
||||||
|
|
||||||
|
>
|
||||||
|
< position startpos moves e2e4
|
||||||
|
|
||||||
|
> Unrecognized command `position startpos moves e2e4`, consult the documentation for more information
|
||||||
|
< go
|
||||||
|
|
||||||
|
> Unrecognized command `go`, consult the documentation for more information
|
|
@ -0,0 +1,38 @@
|
||||||
|
use std::{fs, io};
|
||||||
|
use std::path::Path;
|
||||||
|
use std::sync::{Arc};
|
||||||
|
use crate::uci::{uci_handle_command, UCIState};
|
||||||
|
use spin::Mutex;
|
||||||
|
|
||||||
|
pub mod uci;
|
||||||
|
|
||||||
|
pub const ENGINE_NAME: &str = "Bamboo";
|
||||||
|
pub const ENGINE_VERSION: &str = "1.0";
|
||||||
|
pub const ENGINE_AUTHOR: &str = "c0repwn3r";
|
||||||
|
|
||||||
|
fn main() {
|
||||||
|
println!("{} {} by {}", ENGINE_NAME, ENGINE_VERSION, ENGINE_AUTHOR);
|
||||||
|
|
||||||
|
let mut uci_state = UCIState::new();
|
||||||
|
let mut uci_lock = Arc::new(Mutex::new(uci_state));
|
||||||
|
|
||||||
|
loop {
|
||||||
|
let mut cmdbuf = String::new();
|
||||||
|
match io::stdin().read_line(&mut cmdbuf) {
|
||||||
|
Ok(_) => (),
|
||||||
|
Err(e) => {
|
||||||
|
println!("fatal error reading standard input: {}", e);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
let resp = match uci_handle_command(uci_lock.clone(), cmdbuf.clone()) {
|
||||||
|
Ok(response) => response,
|
||||||
|
Err(e) => {
|
||||||
|
format!("error handling uci command: {}", e)
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
print!("{}", resp);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,62 @@
|
||||||
|
use std::error::Error;
|
||||||
|
use crate::{ENGINE_AUTHOR, ENGINE_NAME, ENGINE_VERSION};
|
||||||
|
use std::fmt::Write;
|
||||||
|
use std::fs;
|
||||||
|
use std::path::Path;
|
||||||
|
use std::sync::{Arc};
|
||||||
|
use spin::Mutex;
|
||||||
|
|
||||||
|
#[derive(Default)]
|
||||||
|
pub struct UCIState {
|
||||||
|
debug: bool,
|
||||||
|
is_blocking: bool
|
||||||
|
}
|
||||||
|
|
||||||
|
impl UCIState {
|
||||||
|
pub fn new() -> Self {
|
||||||
|
Self::default()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn uci_handle_command(state: Arc<Mutex<UCIState>>, cmd: String) -> Result<String, Box<dyn Error>> {
|
||||||
|
let cmd_split = cmd.trim().split(' ').collect::<Vec<&str>>();
|
||||||
|
|
||||||
|
match cmd_split[0] {
|
||||||
|
"uci" => Ok(uci_id()),
|
||||||
|
"isready" => Ok(uci_isready(state)),
|
||||||
|
"debug" => Ok(uci_debug(state, &cmd_split)),
|
||||||
|
"ucinewgame" => Ok("".to_string()),
|
||||||
|
_ => Ok(format!("Unrecognized command `{}`, consult the documentation for more information", cmd.trim()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn uci_id() -> String {
|
||||||
|
let mut result = String::new();
|
||||||
|
|
||||||
|
writeln!(result, "id name {} {}", ENGINE_NAME, ENGINE_VERSION).unwrap();
|
||||||
|
writeln!(result, "id author {}", ENGINE_AUTHOR).unwrap();
|
||||||
|
writeln!(result, "uciok").unwrap();
|
||||||
|
|
||||||
|
result
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn uci_debug(state: Arc<Mutex<UCIState>>, cmd: &Vec<&str>) -> String {
|
||||||
|
if cmd.len() != 2 {
|
||||||
|
return format!("Unrecognized command `{}`, consult the documentation for more information", cmd.join(" "))
|
||||||
|
}
|
||||||
|
|
||||||
|
match cmd[1] {
|
||||||
|
"on" => state.lock().debug = true,
|
||||||
|
"off" => state.lock().debug = false,
|
||||||
|
_ => return format!("Unrecognized command `{}`, consult the documentation for more information", cmd.join(" "))
|
||||||
|
};
|
||||||
|
|
||||||
|
"".to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn uci_isready(state: Arc<Mutex<UCIState>>) -> String {
|
||||||
|
loop {
|
||||||
|
if !state.lock().is_blocking { break; }
|
||||||
|
}
|
||||||
|
"readyok\n".to_string()
|
||||||
|
}
|
Loading…
Reference in New Issue