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(); | 
