summaryrefslogtreecommitdiff
path: root/src/assemblages.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-02-04 10:47:36 +0100
committertroido <troido@protonmail.com>2020-02-04 10:47:36 +0100
commitfd5287ef07f22445cb7dd272e84e60d7de868dab (patch)
treefcf041bb206675e07d96e47e200ceea87c4767d2 /src/assemblages.rs
parent057f38d6933207fb2e39c32f94269db83e7f1db2 (diff)
refactored assemblage and assemblages out of each other
Diffstat (limited to 'src/assemblages.rs')
-rw-r--r--src/assemblages.rs68
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");