From e6476e7afff0234d67ebce7c74e4c91c31d87755 Mon Sep 17 00:00:00 2001 From: troido Date: Thu, 24 Sep 2020 13:10:54 +0200 Subject: actually use the serde serialisation more --- src/encyclopedia.rs | 3 ++- src/item.rs | 2 +- src/parameter.rs | 2 +- src/persistence.rs | 5 ++-- src/pos.rs | 6 ++--- src/roomtemplate.rs | 58 ---------------------------------------- src/savestate.rs | 76 +++++++++++++++++++++++++++++++++++++---------------- src/template.rs | 71 +------------------------------------------------ 8 files changed, 63 insertions(+), 160 deletions(-) (limited to 'src') diff --git a/src/encyclopedia.rs b/src/encyclopedia.rs index 70f0ac6..8acd7e9 100644 --- a/src/encyclopedia.rs +++ b/src/encyclopedia.rs @@ -1,6 +1,7 @@ use std::collections::HashMap; use serde_json::{Value, json}; +use serde::Deserialize; use crate::{ assemblage::Assemblage, componentwrapper::PreEntity, @@ -59,7 +60,7 @@ impl Encyclopedia { name: name.clone(), ent: if let Some(ent) = v.get("entity") { - Template::from_json(ent)? + Template::deserialize(ent).map_err(|e| perr!("template json error deserializing {:?} {:?}", ent, e))? } else { let enttyp = EntityType(k.clone()); assemblages.insert(enttyp.clone(), Assemblage::from_json(&json!({ diff --git a/src/item.rs b/src/item.rs index 0abf35d..a663634 100644 --- a/src/item.rs +++ b/src/item.rs @@ -51,7 +51,7 @@ impl ItemAction { Some(match typ.as_str()? { "eat" => Eat(arg.as_i64()?), "build" => Build( - Template::from_json(arg.get(0)?).ok()?, + Template::deserialize(arg.get(0)?).ok()?, arg.get(1)?.as_array()?.iter().map(|v| Flag::from_str(v.as_str()?).ok()).collect::>>()?, arg.get(2)?.as_array()?.iter().map(|v| Flag::from_str(v.as_str()?).ok()).collect::>>()? ), diff --git a/src/parameter.rs b/src/parameter.rs index c307a27..6facc40 100644 --- a/src/parameter.rs +++ b/src/parameter.rs @@ -69,7 +69,7 @@ parameters!( Int (i64) int, v (v.as_i64().ok_or(perr!("{:?} not an int", v))?) (json!(v)); Pos (Pos) pos, v (Pos::from_json(v).ok_or(perr!("{:?} not a pos", v))?) (json!(v)); Float (f64) float, v (v.as_f64().ok_or(perr!("{:?} not an float", v))?) (json!(v)); - Template (Template) template, v (Template::from_json(v)?) (json!(["template", v.to_json()])); + Template (Template) template, v (Template::deserialize(v).map_err(|e| perr!("template json error {:?}", e))?) (json!(["template", v])); Bool (bool) bool, v (v.as_bool().ok_or(perr!("{:?} not a bool", v))?) (json!(v)); List (Vec) list, v ({ diff --git a/src/persistence.rs b/src/persistence.rs index 2d927ee..932840a 100644 --- a/src/persistence.rs +++ b/src/persistence.rs @@ -81,8 +81,7 @@ impl PersistentStorage for FileStorage { LoaderError::InvalidResource(Box::new(err)) } })?; - let json: Value = inv!(serde_json::from_str(&text))?; - let state = inv!(SaveState::from_json(&json))?; + let state = inv!(serde_json::from_str(&text))?; Ok(state) } @@ -129,7 +128,7 @@ impl PersistentStorage for FileStorage { fs::create_dir_all(&path)?; let fname = id.to_string() + ".save.json"; path.push(fname); - let text = state.to_json().to_string(); + let text = serde_json::to_string(&state).unwrap(); write_file_safe(path, text)?; Ok(()) } diff --git a/src/pos.rs b/src/pos.rs index 4c0d9cc..355ba74 100644 --- a/src/pos.rs +++ b/src/pos.rs @@ -47,15 +47,13 @@ impl Pos { impl Serialize for Pos { fn serialize(&self, serializer: S) -> Result - where S: Serializer, - { + where S: Serializer { (self.x, self.y).serialize(serializer) } } impl<'de> Deserialize<'de> for Pos { fn deserialize(deserializer: D) -> Result - where D: Deserializer<'de>, - { + where D: Deserializer<'de> { let (x, y) = <(i64, i64)>::deserialize(deserializer)?; Ok(Self{x, y}) } diff --git a/src/roomtemplate.rs b/src/roomtemplate.rs index 7110e64..7f25291 100644 --- a/src/roomtemplate.rs +++ b/src/roomtemplate.rs @@ -1,12 +1,9 @@ use std::collections::HashMap; -use serde_json::{json, Value, value}; use serde::{Deserialize, Deserializer, de, Serialize}; use crate::{ Pos, Template, - PResult, - perr, resources::RoomPermissions }; @@ -65,61 +62,6 @@ impl<'de> Deserialize<'de> for RoomTemplate { } } -impl RoomTemplate { - - pub fn from_json(jsonroom: &Value) -> PResult{ - let size = ( - jsonroom.get("width").ok_or(perr!("no width"))?.as_i64().ok_or(perr!("width not a number"))?, - jsonroom.get("height").ok_or(perr!("no height"))?.as_i64().ok_or(perr!("height not a number"))? - ); - let spawn = Pos::from_json(jsonroom.get("spawn").ok_or(perr!("no spawn"))?).ok_or(perr!("spawn not a pos"))?; - - let mut mapping = HashMap::new(); - for (key, value) in jsonroom.get("mapping").ok_or(perr!("no mapping"))?.as_object().ok_or(perr!("mapping not a json object"))?.iter() { - let mut templates: Vec