diff options
| author | troido <troido@protonmail.com> | 2020-02-04 22:23:17 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-02-04 22:23:17 +0100 |
| commit | 323cd679cd29a8475c3b7486ce54ecd37620dbea (patch) | |
| tree | 1fc55c768a7b74644157c23580f54292e960c66a /src/load.rs | |
| parent | eb5997cbf94b1aa230cf4acb3008a7fe80ec36e0 (diff) | |
tried to implement deserialisation of entities
Diffstat (limited to 'src/load.rs')
| -rw-r--r-- | src/load.rs | 69 |
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{}); + } +} + + |
