diff options
Diffstat (limited to 'server/src/data.rs')
-rw-r--r-- | server/src/data.rs | 48 |
1 files changed, 27 insertions, 21 deletions
diff --git a/server/src/data.rs b/server/src/data.rs index c667e760..258057c0 100644 --- a/server/src/data.rs +++ b/server/src/data.rs @@ -20,7 +20,7 @@ use crate::{ interaction::Recipe, protocol::{DemandIndex, ItemIndex, RecipeIndex, TileIndex}, }; -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{anyhow, bail, Result}; use glam::{IVec2, Vec2}; use serde::{Deserialize, Serialize}; use std::{ @@ -30,6 +30,7 @@ use std::{ str::FromStr, sync::{Mutex, RwLock}, }; +use tokio::fs::read_to_string; #[derive(Debug, Deserialize, Serialize, Clone, Copy, Default)] #[serde(rename_all = "snake_case")] @@ -126,35 +127,40 @@ fn data_dir() -> PathBuf { } impl DataIndex { - pub fn reload(&mut self) -> anyhow::Result<()> { + pub fn reload(&mut self) -> Result<()> { *self = serde_yaml::from_reader(File::open(data_dir().join("index.yaml"))?)?; Ok(()) } - pub fn generate(&self, spec: String) -> anyhow::Result<Gamedata> { - let (map, rest) = spec.split_once("-").unwrap_or((spec.as_str(), "default")); - let (demands, recipes) = rest.split_once("-").unwrap_or((rest, "default")); - - if !self.maps.contains(map) { - bail!("unknown map: {map:?}"); + pub async fn read_map(&self, name: &str) -> Result<String> { + if !self.maps.contains(name) { + bail!("unknown map: {name:?}"); } - if !self.demands.contains(demands) { - bail!("unknown demands: {demands:?}"); + let path = data_dir().join(format!("maps/{name}.yaml")); + Ok(read_to_string(path).await?) + } + pub async fn read_demands(&self, name: &str) -> Result<String> { + if !self.demands.contains(name) { + bail!("unknown demands: {name:?}"); } - if !self.recipes.contains(recipes) { - bail!("unknown recipes: {recipes:?}"); + let path = data_dir().join(format!("demands/{name}.yaml")); + Ok(read_to_string(path).await?) + } + pub async fn read_recipes(&self, name: &str) -> Result<String> { + if !self.recipes.contains(name) { + bail!("unknown recipes: {name:?}"); } + let path = data_dir().join(format!("recipes/{name}.yaml")); + Ok(read_to_string(path).await?) + } - let map_path = data_dir().join(format!("maps/{map}.yaml")); - let demands_path = data_dir().join(format!("demands/{demands}.yaml")); - let recipes_path = data_dir().join(format!("recipes/{recipes}.yaml")); + pub async fn generate(&self, spec: String) -> Result<Gamedata> { + let (map, rest) = spec.split_once("-").unwrap_or((spec.as_str(), "default")); + let (demands, recipes) = rest.split_once("-").unwrap_or((rest, "default")); - let map_in = serde_yaml::from_reader(File::open(map_path).context("opening map failed")?)?; - let demands_in = - serde_yaml::from_reader(File::open(demands_path).context("opening demands failed")?)?; - let recipes_in = serde_yaml::from_reader( - File::open(recipes_path).context("opening recipes failed. are they generated yet?")?, - )?; + let map_in = serde_yaml::from_str(&self.read_map(map).await?)?; + let demands_in = serde_yaml::from_str(&self.read_demands(demands).await?)?; + let recipes_in = serde_yaml::from_str(&self.read_recipes(recipes).await?)?; let mut gd = Gamedata::build(map_in, demands_in, recipes_in)?; gd.map_names = self.maps.clone(); |