diff options
author | Ilion Beyst <ilion.beyst@gmail.com> | 2021-12-28 14:57:41 +0100 |
---|---|---|
committer | Ilion Beyst <ilion.beyst@gmail.com> | 2021-12-28 14:57:41 +0100 |
commit | dacc05a41b77bf2e86e27ac354db9b047c661a7d (patch) | |
tree | 3d71fa60ff3449f73ec8bb6066ae82733eb46ee4 /planetwars-cli/src/workspace/mod.rs | |
parent | 5ca8dd4c842ee681ce81a6a7bbd5005cd5b98d3c (diff) | |
download | planetwars.dev-dacc05a41b77bf2e86e27ac354db9b047c661a7d.tar.xz planetwars.dev-dacc05a41b77bf2e86e27ac354db9b047c661a7d.zip |
refactor workspace code
Diffstat (limited to 'planetwars-cli/src/workspace/mod.rs')
-rw-r--r-- | planetwars-cli/src/workspace/mod.rs | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/planetwars-cli/src/workspace/mod.rs b/planetwars-cli/src/workspace/mod.rs new file mode 100644 index 0000000..64777c2 --- /dev/null +++ b/planetwars-cli/src/workspace/mod.rs @@ -0,0 +1,77 @@ +use serde::{Deserialize, Serialize}; +use std::collections::HashMap; +use std::env; +use std::fs; +use std::io; +use std::path::{Path, PathBuf}; + +use self::bot::WorkspaceBot; + +const WORKSPACE_CONFIG_FILENAME: &str = "pw_workspace.toml"; + +pub mod bot; + +pub struct Workspace { + root_path: PathBuf, + config: WorkspaceConfig, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct WorkspaceConfig { + paths: WorkspacePaths, + bots: HashMap<String, BotEntry>, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct WorkspacePaths { + maps_dir: PathBuf, + matches_dir: PathBuf, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct BotEntry { + path: PathBuf, +} + +impl Workspace { + pub fn open(root_path: &Path) -> io::Result<Workspace> { + let config_path = root_path.join(WORKSPACE_CONFIG_FILENAME); + let config_str = fs::read_to_string(config_path)?; + let workspace_config: WorkspaceConfig = toml::from_str(&config_str)?; + + Ok(Workspace { + root_path: root_path.to_path_buf(), + config: workspace_config, + }) + } + + pub fn open_current_dir() -> io::Result<Workspace> { + Workspace::open(&env::current_dir()?) + } + + pub fn maps_dir(&self) -> PathBuf { + self.root_path.join(&self.config.paths.maps_dir) + } + + pub fn map_path(&self, map_name: &str) -> PathBuf { + self.maps_dir().join(format!("{}.json", map_name)) + } + + pub fn matches_dir(&self) -> PathBuf { + self.root_path.join(&self.config.paths.matches_dir) + } + + pub fn match_path(&self, match_name: &str) -> PathBuf { + self.matches_dir().join(format!("{}.log", match_name)) + } + + pub fn get_bot(&self, bot_name: &str) -> io::Result<WorkspaceBot> { + let bot_entry = self.config.bots.get(bot_name).ok_or_else(|| { + io::Error::new( + io::ErrorKind::NotFound, + format!("no such bot: {}", bot_name), + ) + })?; + WorkspaceBot::open(&self.root_path.join(&bot_entry.path)) + } +} |