summaryrefslogtreecommitdiff
path: root/src/assemblages.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/assemblages.rs')
-rw-r--r--src/assemblages.rs34
1 files changed, 32 insertions, 2 deletions
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<Value>, _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<Value>, kwargs: HashMap<&str, Value>);
}