summaryrefslogtreecommitdiff
path: root/src/load.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-04 22:23:17 +0100
committertroido <troido@protonmail.com>2020-02-04 22:23:17 +0100
commit323cd679cd29a8475c3b7486ce54ecd37620dbea (patch)
tree1fc55c768a7b74644157c23580f54292e960c66a /src/load.rs
parenteb5997cbf94b1aa230cf4acb3008a7fe80ec36e0 (diff)
tried to implement deserialisation of entities
Diffstat (limited to 'src/load.rs')
-rw-r--r--src/load.rs69
1 files changed, 69 insertions, 0 deletions
diff --git a/src/load.rs b/src/load.rs
new file mode 100644
index 0000000..186ea7e
--- /dev/null
+++ b/src/load.rs
@@ -0,0 +1,69 @@
+
+use std::collections::HashMap;
+use serde_json::Value;
+use super::assemblage::Assemblage;
+use super::assemblages::{Player, Grass, Wall};
+
+pub fn load_assemblages(data: Value) -> Vec<Box<dyn Assemblage>> {
+ parse_assemblages(data).into_iter().filter_map(|x| x).collect()
+}
+
+fn parse_assemblages(data: Value) -> Vec<Option<Box<dyn Assemblage>>> {
+ match data {
+ Value::String(txt) => vec![from_args(txt, Vec::new(), HashMap::new())],
+ Value::Array(list) => list.into_iter().map(parse_assemblages).flatten().collect(),
+ Value::Object(mut obj) => {
+ if let Some(Value::String(typename)) = obj.remove("type") {
+ let args = if let Some(Value::Array(a)) = obj.remove("args") {a} else {Vec::new()};
+ let kwargs: HashMap<String, Value> = if let Some(Value::Object(o)) = obj.remove("kwargs") {
+ o.into_iter().collect()
+ } else {HashMap::new()};
+ vec![from_args(
+ typename,
+ args,
+ kwargs
+ )]
+ } else {Vec::new()}
+ },
+ _ => Vec::new()
+ }
+}
+
+macro_rules! dynasm {
+ ($typ:ident) => {Some({
+ let b : Box<dyn Assemblage> = Box::new({
+ let o = $typ::default();
+ o
+ });
+ b
+ })}
+}
+
+fn from_args(typename: String, args: Vec<Value>, kwargs: HashMap<String, Value>) -> Option<Box<dyn Assemblage>>{
+ let mut obj = match typename.as_str() {
+ "player" => dynasm!(Player),
+ "grass" => dynasm!(Grass),
+ "wall" => dynasm!(Wall),
+ _ => None
+ }?;
+ obj.init_from_json(args, kwargs);
+ Some(obj)
+}
+
+
+#[cfg(test)]
+mod tests {
+ use super::*;
+ use serde_json::json;
+ use std::any::Any;
+ #[test]
+ fn test_assemblage_from_json() {
+ let mut walls1 = load_assemblages(json!("wall"));
+ assert_eq!(walls1.len(), 1);
+ let wallbox1 = walls1.pop().unwrap();
+// assert_eq!(, vec![Box::new(Wall{})]);
+// assert_eq!(load_assemblages(json!("wall", ["test"], {"abc": 123})), Wall{});
+ }
+}
+
+