diff options
| author | troido <troido@protonmail.com> | 2020-02-04 10:47:36 +0100 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-02-04 10:47:36 +0100 |
| commit | fd5287ef07f22445cb7dd272e84e60d7de868dab (patch) | |
| tree | fcf041bb206675e07d96e47e200ceea87c4767d2 | |
| parent | 057f38d6933207fb2e39c32f94269db83e7f1db2 (diff) | |
refactored assemblage and assemblages out of each other
| -rw-r--r-- | src/assemblage.rs | 62 | ||||
| -rw-r--r-- | src/assemblages.rs | 68 | ||||
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/resources.rs | 2 | ||||
| -rw-r--r-- | src/room.rs | 2 |
5 files changed, 68 insertions, 67 deletions
diff --git a/src/assemblage.rs b/src/assemblage.rs new file mode 100644 index 0000000..8949205 --- /dev/null +++ b/src/assemblage.rs @@ -0,0 +1,62 @@ + + + + +#[macro_export] +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: specs::EntityBuilder<'a>) -> specs::EntityBuilder<'a>{ + $( + let $arg = &self.$arg; + )* + $( + builder = specs::Builder::with(builder, $comp); + )* + builder + } + + #[allow(unused_variables, unused_mut)] + fn init_from_json(&mut self, mut args: Vec<serde_json::Value>, kwargs: std::collections::HashMap<&str, serde_json::Value>) { + $( + if args.len() > 0 { + let val = args.remove(0); + if let Some(actual_val) = super::unpack_json!($argt, val) { + self.$arg = actual_val; + } + } + )* + $( + if let Some(val) = kwargs.get(stringify!($arg)) { + if let Some(actual_val) = super::unpack_json!($argt, val) { + self.$arg = actual_val; + } + } + )* + } + } + } +} + +#[macro_export] +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: specs::EntityBuilder<'a>) -> specs::EntityBuilder<'a>; + fn init_from_json(&mut self, args: Vec<serde_json::Value>, kwargs: std::collections::HashMap<&str, serde_json::Value>); +} + + 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"); diff --git a/src/main.rs b/src/main.rs index b1d30bb..646d2f3 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,6 +15,7 @@ mod resources; mod systems; mod worldmessages; mod pos; +mod assemblage; use self::gameserver::GameServer; use self::server::unixserver::UnixServer; diff --git a/src/resources.rs b/src/resources.rs index fcc4f32..e8b4059 100644 --- a/src/resources.rs +++ b/src/resources.rs @@ -4,7 +4,7 @@ use specs::Entity; use super::pos::Pos; use super::controls::Action; -use super::assemblages::Assemblage; +use super::assemblage::Assemblage; use super::worldmessages::WorldMessage; diff --git a/src/room.rs b/src/room.rs index a6c696d..5eaee8e 100644 --- a/src/room.rs +++ b/src/room.rs @@ -13,7 +13,7 @@ use specs::{ use super::controls::Action; use super::pos::Pos; use super::components::Position; -use super::assemblages::Assemblage; +use super::assemblage::Assemblage; use super::worldmessages::WorldMessage; use super::resources::{ Size, |
