aboutsummaryrefslogtreecommitdiff
path: root/server/src/data.rs
diff options
context:
space:
mode:
Diffstat (limited to 'server/src/data.rs')
-rw-r--r--server/src/data.rs48
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();