diff options
Diffstat (limited to 'src/worldloader.rs')
| -rw-r--r-- | src/worldloader.rs | 51 |
1 files changed, 49 insertions, 2 deletions
diff --git a/src/worldloader.rs b/src/worldloader.rs index 683a310..9389e58 100644 --- a/src/worldloader.rs +++ b/src/worldloader.rs @@ -6,7 +6,9 @@ use serde_json::Value; use crate::{ RoomId, roomtemplate::RoomTemplate, - Result + Result, + aerr, + Encyclopedia }; @@ -21,12 +23,57 @@ impl WorldLoader { } } + pub fn load_world_meta(&self) -> Result<WorldMeta> { + let path = self.directory.join("world.json"); + let text = fs::read_to_string(path)?; + let json: Value = serde_json::from_str(&text)?; + let default_room = RoomId::from_str( + json + .get("default_room") + .ok_or(aerr!("world meta does not have default_room"))? + .as_str() + .ok_or(aerr!("world meta default_room is not a string"))? + ); + let encyclopedia_name = + json + .get("encyclopedia") + .ok_or(aerr!("world meta does not have encyclopedia"))? + .as_str() + .ok_or(aerr!("world meta encyclopedia is not a string"))? + .to_string(); + Ok(WorldMeta{ + default_room, + encyclopedia_name + }) + } + pub fn load_room(&self, id: RoomId) -> Result<RoomTemplate> { let fname = id.name.splitn(2, '+').next().unwrap().to_string() + ".json"; - let path = self.directory.join(fname); + let path = self.directory.join("maps").join(fname); let text = fs::read_to_string(path)?; let json: Value = serde_json::from_str(&text)?; let template = RoomTemplate::from_json(&json)?; Ok(template) } + + pub fn load_encyclopedia(&self, name: &str) -> Result<Encyclopedia> { + let fname: String = name.to_string() + ".json"; + let encyclopedia = Encyclopedia::from_json( + serde_json::from_str( + &fs::read_to_string( + self.directory + .join("encyclopediae") + .join(&fname) + )? + )? + )?; + encyclopedia.validate()?; + Ok(encyclopedia) + } +} + +pub struct WorldMeta { + pub encyclopedia_name: String, + pub default_room: RoomId } + |
