summaryrefslogtreecommitdiff
path: root/src/componentwrapper.rs
diff options
context:
space:
mode:
Diffstat (limited to 'src/componentwrapper.rs')
-rw-r--r--src/componentwrapper.rs50
1 files changed, 48 insertions, 2 deletions
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index 5fe8f1d..d677cb2 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -132,10 +132,10 @@ macro_rules! components {
(pre: ($($done: tt)*)) => {
components!(post: $($done)*);
};
- ($($all: tt)*) => {components!(pre: () $($all)*);};
+ (all: $($all: tt)*) => {components!(pre: () $($all)*);};
}
-components!(
+components!(all:
Visible (name: String, sprite: String, height: Float) {
Visible {
sprite: Sprite{name: sprite},
@@ -238,6 +238,52 @@ components!(
};
Ear () {Ear::default()};
Build (obj: Template);
+ Whitelist (
+ allowed: List ({
+ Whitelist.allowed.iter().map(|(item, players)|{
+ Parameter::List(vec![
+ Parameter::String(item.clone()),
+ Parameter::List(
+ players
+ .iter()
+ .map(|playerid| Parameter::String(playerid.name.clone()))
+ .collect()
+ )
+ ])
+ }).collect()
+ })
+ ) {
+ Whitelist {
+ allowed: allowed
+ .iter()
+ .map(|p| {
+ if let Parameter::List(e) = p {
+ if e.len() != 2 {
+ Err(aerr!("whitelist must be a list of pairs"))?
+ }
+ if let (Parameter::String(s), Parameter::List(l)) = (e[0].clone(), e[1].clone()) {
+ let names = l
+ .iter()
+ .map(|n| {
+ if let Parameter::String(name) = n {
+ Ok(PlayerId{name: name.clone()})
+ } else {
+ Err(aerr!("whitelisted players must be strings"))?
+ }
+ })
+ .collect::<Result<HashSet<PlayerId>>>()?;
+ Ok((s, names))
+ } else {
+ Err(aerr!("whitelist entries must be a string and a list"))?
+ }
+ } else {
+ Err(aerr!("whitelist must be a list of pairs"))?
+ }
+ })
+ .collect::<Result<HashMap<String, HashSet<PlayerId>>>>()?
+ }
+ };
+ Dedup (id: String, priority: Int);
);