From fd5287ef07f22445cb7dd272e84e60d7de868dab Mon Sep 17 00:00:00 2001 From: troido Date: Tue, 4 Feb 2020 10:47:36 +0100 Subject: refactored assemblage and assemblages out of each other --- src/assemblage.rs | 62 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 src/assemblage.rs (limited to 'src/assemblage.rs') 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, 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, kwargs: std::collections::HashMap<&str, serde_json::Value>); +} + + -- cgit