diff options
Diffstat (limited to 'server/data')
| -rw-r--r-- | server/data/src/index.rs | 33 |
1 files changed, 16 insertions, 17 deletions
diff --git a/server/data/src/index.rs b/server/data/src/index.rs index a5ec8d97..9a44d202 100644 --- a/server/data/src/index.rs +++ b/server/data/src/index.rs @@ -23,35 +23,34 @@ use std::{ collections::{HashMap, HashSet}, fs::{File, read_to_string}, path::PathBuf, - str::FromStr, - sync::Mutex, }; use crate::{MapDecl, Serverdata, book::book, build_data}; -#[derive(Debug, Deserialize, Default)] +#[derive(Debug, Deserialize)] pub struct DataIndex { + #[serde(skip)] + pub path: PathBuf, pub maps: HashMap<String, MapMetadata>, pub recipes: HashSet<String>, } -pub static DATA_DIR: Mutex<Option<PathBuf>> = Mutex::new(None); -fn data_dir() -> PathBuf { - DATA_DIR - .lock() - .unwrap() - .to_owned() - .unwrap_or_else(|| PathBuf::from_str("data").unwrap()) -} - impl DataIndex { - pub fn load() -> Result<Self> { - let mut s = Self::default(); + pub fn new(path: PathBuf) -> Result<Self> { + let mut s = Self { + path, + maps: HashMap::new(), + recipes: HashSet::new(), + }; s.reload()?; Ok(s) } pub fn reload(&mut self) -> Result<()> { - *self = serde_yml::from_reader(File::open(data_dir().join("index.yaml"))?)?; + let path = self.path.clone(); + *self = serde_yml::from_reader( + File::open(self.path.join("index.yaml")).context("Failed opening data index")?, + )?; + self.path = path; Ok(()) } @@ -60,14 +59,14 @@ impl DataIndex { if name.contains("..") || name.starts_with("/") || name.contains("//") { bail!("illegal map path"); } - let path = data_dir().join(format!("maps/{name}.yaml")); + let path = self.path.join(format!("maps/{name}.yaml")); Ok(read_to_string(path)?) } pub 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")); + let path = self.path.join(format!("recipes/{name}.yaml")); Ok(read_to_string(path)?) } pub fn generate(&self, map: &str) -> Result<(Gamedata, Serverdata)> { |