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