summaryrefslogtreecommitdiff
path: root/src/worldloader.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/worldloader.rs')
-rw-r--r--src/worldloader.rs51
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
}
+