summaryrefslogtreecommitdiff
path: root/src/assemblage.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/assemblage.rs
parent057f38d6933207fb2e39c32f94269db83e7f1db2 (diff)
refactored assemblage and assemblages out of each other
Diffstat (limited to 'src/assemblage.rs')
-rw-r--r--src/assemblage.rs62
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>);
+}
+
+