summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-09-27 18:07:07 +0200
committertroido <troido@protonmail.com>2020-09-27 18:07:07 +0200
commit81e21e6e923e212509ad9f1b58fc901f02e80e18 (patch)
treec48aec0db9a7d35c128e5446026897f834c3c389
parent09cc0f0e81a339faec191b773b5eca985d15799c (diff)
use json5 for encyclopedia and room definitions
-rw-r--r--Cargo.toml1
-rw-r--r--src/worldloader.rs33
2 files changed, 8 insertions, 26 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 86cbcc8..5881813 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -23,3 +23,4 @@ ring = "0.16.12"
strum = "0.19"
strum_macros = "0.19"
chrono = "0.4.17"
+json5 = "0.2.8"
diff --git a/src/worldloader.rs b/src/worldloader.rs
index c8738e2..75465bb 100644
--- a/src/worldloader.rs
+++ b/src/worldloader.rs
@@ -1,9 +1,8 @@
use std::path::{PathBuf};
use std::fs;
-use serde_json;
-use serde_json::Value;
-use serde::Deserialize;
+use json5;
+use serde::{Serialize, Deserialize};
use crate::{
RoomId,
roomtemplate::RoomTemplate,
@@ -27,41 +26,22 @@ 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::deserialize(
- json.get("default_room").ok_or(aerr!("world meta does not have default_room"))?
- ).map_err(|e| aerr!("invalid roomid for default room: {}", e))?;
- let encyclopediae =
- json
- .get("encyclopediae")
- .ok_or(aerr!("world meta does not have encyclopediae"))?
- .as_array()
- .ok_or(aerr!("world meta encyclopediae is not a list"))?
- .iter()
- .map(|v| Ok(v
- .as_str()
- .ok_or(aerr!("world meta encyclopediae item {:?} is not a string", v))?
- .to_string()
- ))
- .collect::<Result<Vec<String>>>()?;
- Ok(WorldMeta{
- default_room,
- encyclopediae
- })
+ let meta = json5::from_str(&text)?;
+ Ok(meta)
}
pub fn load_room(&self, id: RoomId) -> Result<RoomTemplate> {
let fname = id.to_string().splitn(2, '+').next().unwrap().to_string() + ".json";
let path = self.directory.join("maps").join(fname);
let text = fs::read_to_string(path)?;
- let template = serde_json::from_str(&text)?;
+ let template = json5::from_str(&text)?;
Ok(template)
}
pub fn load_encyclopedia(&self, name: &str) -> Result<Encyclopedia> {
let fname: String = name.to_string() + ".json";
let encyclopedia: Encyclopedia =
- serde_json::from_str(
+ json5::from_str(
&fs::read_to_string(
self.directory
.join("encyclopediae")
@@ -73,6 +53,7 @@ impl WorldLoader {
}
}
+#[derive(Debug, PartialEq, Eq, Clone, Serialize, Deserialize)]
pub struct WorldMeta {
pub encyclopediae: Vec<String>,
pub default_room: RoomId