aboutsummaryrefslogtreecommitdiff
path: root/planetwars-client
diff options
context:
space:
mode:
Diffstat (limited to 'planetwars-client')
-rw-r--r--planetwars-client/Cargo.toml1
-rw-r--r--planetwars-client/src/main.rs27
2 files changed, 25 insertions, 3 deletions
diff --git a/planetwars-client/Cargo.toml b/planetwars-client/Cargo.toml
index 4ff96f2..c83950b 100644
--- a/planetwars-client/Cargo.toml
+++ b/planetwars-client/Cargo.toml
@@ -14,6 +14,7 @@ serde = { version = "1.0", features = ["derive"] }
toml = "0.5"
planetwars-matchrunner = { path = "../planetwars-matchrunner" }
clap = { version = "3.2", features = ["derive", "env"]}
+shlex = "1.1"
[build-dependencies]
tonic-build = "0.7.2"
diff --git a/planetwars-client/src/main.rs b/planetwars-client/src/main.rs
index c9d97b0..6edcc2e 100644
--- a/planetwars-client/src/main.rs
+++ b/planetwars-client/src/main.rs
@@ -32,7 +32,24 @@ struct PlayMatch {
struct BotConfig {
#[allow(dead_code)]
name: String,
- command: Vec<String>,
+ command: Command,
+ working_directory: Option<String>,
+}
+
+#[derive(Deserialize)]
+#[serde(untagged)]
+enum Command {
+ String(String),
+ Argv(Vec<String>),
+}
+
+impl Command {
+ pub fn to_argv(&self) -> Vec<String> {
+ match self {
+ Command::Argv(vec) => vec.clone(),
+ Command::String(s) => shlex::split(s).expect("invalid command string"),
+ }
+ }
}
#[tokio::main]
@@ -76,8 +93,12 @@ async fn run_player(bot_config: BotConfig, player_key: String, channel: Channel)
});
let mut bot_process = Bot {
- working_dir: PathBuf::from("."),
- argv: bot_config.command,
+ working_dir: PathBuf::from(
+ bot_config
+ .working_directory
+ .unwrap_or_else(|| ".".to_string()),
+ ),
+ argv: bot_config.command.to_argv(),
}
.spawn_process();