diff options
author | metamuffin <metamuffin@disroot.org> | 2024-07-07 23:03:07 +0200 |
---|---|---|
committer | metamuffin <metamuffin@disroot.org> | 2024-07-07 23:03:07 +0200 |
commit | cd6e8f3886d764847f92ad75d397e2f2f6ad930a (patch) | |
tree | c99e141bc51c2004cdde1b0660ed10b2696f04d8 /server/src/data.rs | |
parent | fd46def1ebc10d1f2ee4f4447f33e2dfb35986d2 (diff) | |
download | hurrycurry-cd6e8f3886d764847f92ad75d397e2f2f6ad930a.tar hurrycurry-cd6e8f3886d764847f92ad75d397e2f2f6ad930a.tar.bz2 hurrycurry-cd6e8f3886d764847f92ad75d397e2f2f6ad930a.tar.zst |
add option to download map source
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(); |