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 /src/assemblage.rs | |
| parent | 057f38d6933207fb2e39c32f94269db83e7f1db2 (diff) | |
refactored assemblage and assemblages out of each other
Diffstat (limited to 'src/assemblage.rs')
| -rw-r--r-- | src/assemblage.rs | 62 |
1 files changed, 62 insertions, 0 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>); +} + + |
