diff options
Diffstat (limited to 'src/savestate.rs')
| -rw-r--r-- | src/savestate.rs | 76 |
1 files changed, 54 insertions, 22 deletions
diff --git a/src/savestate.rs b/src/savestate.rs index 95f8d84..a81235f 100644 --- a/src/savestate.rs +++ b/src/savestate.rs @@ -1,13 +1,14 @@ use std::collections::HashMap; -use serde_json::{json, Value}; +use serde::{Serialize, Deserialize, Serializer, Deserializer}; + use crate::{ Pos, Template, - PResult, - perr }; + +#[derive(Debug, Clone, PartialEq)] pub struct SaveState { pub changes: HashMap<Pos, Vec<Template>> } @@ -19,27 +20,58 @@ impl SaveState { changes: HashMap::new() } } +} + +#[derive(Debug, Clone, PartialEq, Deserialize, Serialize)] +struct SaveStateVec {pub changes: Vec<(Pos, Vec<Template>)>} + +impl Serialize for SaveState { + fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error> + where S: Serializer { + SaveStateVec{changes: self.changes.clone().into_iter().collect()}.serialize(serializer) + } +} +impl<'de> Deserialize<'de> for SaveState { + fn deserialize<D>(deserializer: D) -> Result<Self, D::Error> + where D: Deserializer<'de> { + Ok(Self{changes: SaveStateVec::deserialize(deserializer)?.changes.into_iter().collect()}) + } +} + +#[cfg(test)] +mod tests{ + use super::*; + use crate::hashmap; - pub fn to_json(&self) -> Value { - json!({ - "changes": self.changes.iter().map( - |(pos, templates)| - (pos, templates.iter().map(|t| t.to_json()).collect()) - ).collect::<Vec<(&Pos, Vec<Value>)>>() - }) + #[test] + fn test_empty_deserialize(){ + assert_eq!(SaveState::deserialize(json!({"changes":[]})).unwrap(), SaveState::new()); } - pub fn from_json(val: &Value) -> PResult<Self> { - let mut changes = HashMap::new(); - for v in val.get("changes").ok_or(perr!("save does not have changes"))?.as_array().ok_or(perr!("changes not an array"))? { - let pos = Pos::from_json(v.get(0).ok_or(perr!("change does not have index 0"))?).ok_or(perr!("change index 0 is not a pos"))?; - let mut templates = Vec::new(); - let jsontemplates = v.get(1).ok_or(perr!("change does not have index 1"))?; - for t in jsontemplates.as_array().clone().unwrap_or(&vec![jsontemplates.clone()]) { - templates.push(Template::from_json(t)?); - } - changes.entry(pos).or_insert_with(Vec::new).append(&mut templates); - } - Ok(Self {changes}) + #[test] + fn test_empty_serialize(){ + assert_eq!(serde_json::to_value(SaveState::new()).unwrap(), json!({"changes":[]})); + } + + + #[test] + fn test_change_serialize(){ + assert_eq!( + serde_json::to_value( + SaveState{changes: hashmap!{Pos::new(5,2) => vec![Template::empty("grass"), Template::empty("tree")]}} + ).unwrap(), + json!({"changes":[[[5,2],["grass", "tree"]]]}) + ); + } + + #[test] + fn test_changes_deserialize(){ + assert_eq!( + SaveState::deserialize(json!({"changes":[[[1,1],["grass"]], [[5,2],["grass", "tree"]]]})).unwrap(), + SaveState{changes: hashmap!{ + Pos::new(1,1) => vec![Template::empty("grass")], + Pos::new(5,2) => vec![Template::empty("grass"), Template::empty("tree")] + }} + ); } } |
