From 33576fe7a5f241dbd884315c3552ad8186562e74 Mon Sep 17 00:00:00 2001 From: troido Date: Mon, 3 Feb 2020 23:03:11 +0100 Subject: can initialise Assemblages from json lists and dicts --- src/assemblages.rs | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) (limited to 'src/assemblages.rs') diff --git a/src/assemblages.rs b/src/assemblages.rs index b43548c..729a65d 100644 --- a/src/assemblages.rs +++ b/src/assemblages.rs @@ -1,6 +1,7 @@ - +use std::collections::HashMap; use rand::Rng; +use serde_json::Value; use specs::{ Builder, EntityBuilder @@ -10,7 +11,7 @@ use super::components::{Visible, Blocking, Played}; macro_rules! assemblage { ($name:ident { $($arg:ident : $argt:ident ),* } ; $( $comp:expr ),* ) => { - #[derive(Debug, Clone)] + #[derive(Debug, Clone, Default)] pub struct $name {$( pub $arg : $argt )* } @@ -24,15 +25,44 @@ macro_rules! assemblage { )* builder } + + fn init_from_json(&mut self, mut _args: Vec, _kwargs: HashMap<&str, Value>) { + $( + if _args.len() > 0 { + let val = _args.remove(0); + if let Some(actual_val) = unpack_json!($argt, val) { + self.$arg = actual_val; + } + } + )* + $( + if let Some(val) = _kwargs.get(stringify!($arg)) { + if let Some(actual_val) = unpack_json!($argt, val) { + self.$arg = actual_val; + } + } + )* + } } unsafe impl Send for $name {} unsafe impl Sync for $name {} } } +macro_rules! unpack_json { + (String, $val: ident) => { + if let Some(txt) = $val.as_str(){ + Some(txt.to_string()) + } else { + None + } + } +} + pub trait Assemblage: Send + Sync { fn build<'a>(&self, builder: EntityBuilder<'a>) -> EntityBuilder<'a>; + fn init_from_json(&mut self, args: Vec, kwargs: HashMap<&str, Value>); } -- cgit