From 4a4cdf7d148be0a2a756f323d27c0ee5b7976438 Mon Sep 17 00:00:00 2001 From: troido Date: Fri, 14 Feb 2020 14:36:32 +0100 Subject: extract the state to save --- src/savestate.rs | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 src/savestate.rs (limited to 'src/savestate.rs') diff --git a/src/savestate.rs b/src/savestate.rs new file mode 100644 index 0000000..8afbbf1 --- /dev/null +++ b/src/savestate.rs @@ -0,0 +1,40 @@ + +use std::collections::HashMap; +use serde_json::{json, Value}; +use crate::Pos; +use crate::template::Template; + +pub struct SaveState { + pub changes: HashMap> +} + +impl SaveState { + + pub fn new() -> Self { + Self { + changes: HashMap::new() + } + } + + pub fn to_json(&self) -> Value { + json!({ + "changes": self.changes.iter().map( + |(pos, templates)| + (pos, templates.iter().map(|t| t.to_json()).collect()) + ).collect::)>>() + }) + } + + pub fn from_json(val: &Value) -> Option { + let mut changes = HashMap::new(); + for v in val.get("changes")?.as_array()? { + let pos = Pos::from_json(v.get(0)?)?; + let mut templates = Vec::new(); + for t in v.get(1)?.as_array()? { + templates.push(Template::from_json(t)?); + } + changes.insert(pos, templates); + } + Some(Self {changes}) + } +} -- cgit