diff options
Diffstat (limited to 'src/assemblages.rs')
| -rw-r--r-- | src/assemblages.rs | 68 |
1 files changed, 3 insertions, 65 deletions
diff --git a/src/assemblages.rs b/src/assemblages.rs index f90c5d0..c7140c9 100644 --- a/src/assemblages.rs +++ b/src/assemblages.rs @@ -1,70 +1,8 @@ -use std::collections::HashMap; use rand::Rng; -use serde_json::Value; -use specs::{ - Builder, - EntityBuilder -}; - use super::components::{Visible, Blocking, Played}; - -macro_rules! assemblage { - ($name:ident { $($arg:ident : $argt:ident ),* } ; $( $comp:expr ),* ) => { - #[derive(Debug, Clone, Default)] - pub struct $name {$( - pub $arg : $argt - )* } - impl Assemblage for $name { - fn build<'a>(&self, mut builder: EntityBuilder<'a>) -> EntityBuilder<'a>{ - $( - let $arg = &self.$arg; - )* - $( - builder = builder.with($comp); - )* - builder - } - - #[allow(unused_variables, unused_mut)] - 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; - } - } - )* - } - } - } -} - -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>); -} - - +use super::assemblage; +use super::assemblage::Assemblage; assemblage!(Wall {}; Visible{sprite: "wall".to_string(), height: 2.0}, Blocking); @@ -98,7 +36,7 @@ mod tests { fn test_assemblage_from_json() { let mut p = Player::new("Joe"); assert_eq!(p.name, "Joe"); - p.init_from_json(vec![json!("Bob"), json!("Mike")], HashMap::new()); + p.init_from_json(vec![json!("Bob"), json!("Mike")], hashmap!()); assert_eq!(p.name, "Bob"); p.init_from_json(vec![], hashmap!("sprite" => json!("stone"))); assert_eq!(p.name, "Bob"); |
