summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/componentwrapper.rs17
-rw-r--r--src/fromtoparameter.rs152
-rw-r--r--src/main.rs1
-rw-r--r--src/parameter.rs110
4 files changed, 159 insertions, 121 deletions
diff --git a/src/componentwrapper.rs b/src/componentwrapper.rs
index 416852d..c5d95c5 100644
--- a/src/componentwrapper.rs
+++ b/src/componentwrapper.rs
@@ -17,7 +17,8 @@ use crate::{
Trigger,
interactable::Interactable
},
- parameter::{Parameter, FromToParameter},
+ parameter::{Parameter},
+ fromtoparameter::FromToParameter,
Timestamp,
Template,
Pos,
@@ -143,16 +144,10 @@ macro_rules! components {
}
components!(all:
- Visible (name: String, sprite: String, height: f64) {
- Visible {
- sprite: Sprite{name: sprite},
- height,
- name
- }
- };
+ Visible (name: String, sprite: Sprite, height: f64);
Movable (cooldown: i64);
- Player (name: String) {Player::new(PlayerId{name})};
- Item (item: String) {Item(ItemId(item))};
+ Player (name: PlayerId) {Player::new(name)};
+ Item (item: ItemId) {Item(item)};
Inventory () {panic!("inventory from parameters not implemented")};
Health (health: i64, maxhealth: i64);
Serialise () {panic!("serialise from parameters not implemented")};
@@ -225,7 +220,7 @@ components!(all:
allowed: Vec<(String, Vec<String>)>, ({
Whitelist.allowed.iter().map(|(item, players)|
(item.clone(), players.iter().map(|playerid| playerid.name.clone()).collect())
- ).collect::<Vec<(String, Vec<String>)>>()
+ ).collect()
})
) {
Whitelist {
diff --git a/src/fromtoparameter.rs b/src/fromtoparameter.rs
new file mode 100644
index 0000000..4abfdfd
--- /dev/null
+++ b/src/fromtoparameter.rs
@@ -0,0 +1,152 @@
+
+
+use crate::{
+ parameter::Parameter,
+ Template,
+ Pos,
+ components::interactable::Interactable,
+ PlayerId,
+ Sprite,
+ ItemId
+};
+
+pub trait FromToParameter: Sized {
+ fn from_parameter(p: Parameter) -> Option<Self>;
+ fn to_parameter(self) -> Parameter;
+}
+
+
+
+impl FromToParameter for Parameter {
+ fn from_parameter(p: Parameter) -> Option<Self>{
+ Some(p)
+ }
+ fn to_parameter(self) -> Parameter {
+ self
+ }
+}
+
+macro_rules! tofrom {
+ ($typ: ty : $paramtyp: ident) => {
+ impl FromToParameter for $typ {
+ fn from_parameter(p: Parameter) -> Option<Self>{
+ if let Parameter::$paramtyp(i) = p {
+ Some(i)
+ } else {
+ None
+ }
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::$paramtyp(self)
+ }
+ }
+ };
+ ($typ: ident { $arg: ident : $paramtyp: ident } ) => {
+ impl FromToParameter for $typ {
+ fn from_parameter(p: Parameter) -> Option<Self>{
+ if let Parameter::$paramtyp(i) = p {
+ Some($typ { $arg: i})
+ } else {
+ None
+ }
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::$paramtyp(self.$arg)
+ }
+ }
+ };
+ ($typ: ident ($paramtyp: ident ) ) => {
+ impl FromToParameter for $typ {
+ fn from_parameter(p: Parameter) -> Option<Self>{
+ if let Parameter::$paramtyp(i) = p {
+ Some($typ (i))
+ } else {
+ None
+ }
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::$paramtyp(self.0)
+ }
+ }
+ }
+}
+
+tofrom!(i64: Int);
+tofrom!(f64: Float);
+tofrom!(bool:Bool);
+tofrom!(String: String);
+tofrom!(Pos: Pos);
+tofrom!(Template: Template);
+tofrom!(Interactable: Interaction);
+
+tofrom!(PlayerId{name: String});
+tofrom!(Sprite{name: String});
+tofrom!(ItemId(String));
+
+impl<T> FromToParameter for Vec<T>
+where
+ T: FromToParameter,
+{
+ fn from_parameter(p: Parameter) -> Option<Self>{
+ if let Parameter::List(items) = p{
+ let mut v = Self::new();
+ for item in items {
+ if let Some(t) = T::from_parameter(item){
+ v.push(t);
+ } else {
+ return None;
+ }
+ }
+ Some(v)
+ } else {
+ None
+ }
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::List(self.into_iter().map(|item| item.to_parameter()).collect())
+ }
+}
+
+impl<T, U> FromToParameter for (T, U)
+where
+ T: FromToParameter,
+ U: FromToParameter,
+{
+ fn from_parameter(p: Parameter) -> Option<Self> {
+ if let Parameter::List(mut items) = p {
+ if items.len() == 2 {
+ return Some((
+ T::from_parameter(items.remove(0))?,
+ U::from_parameter(items.remove(0))?
+ ))
+ }
+ }
+ None
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::List(vec![self.0.to_parameter(), self.1.to_parameter()])
+ }
+}
+
+impl<T, U, V> FromToParameter for (T, U, V)
+where
+ T: FromToParameter,
+ U: FromToParameter,
+ V: FromToParameter,
+{
+ fn from_parameter(p: Parameter) -> Option<Self> {
+ if let Parameter::List(mut items) = p {
+ if items.len() == 3 {
+ return Some((
+ T::from_parameter(items.remove(0))?,
+ U::from_parameter(items.remove(0))?,
+ V::from_parameter(items.remove(0))?
+ ))
+ }
+ }
+ None
+ }
+ fn to_parameter(self) -> Parameter {
+ Parameter::List(vec![self.0.to_parameter(), self.1.to_parameter(), self.2.to_parameter()])
+ }
+}
diff --git a/src/main.rs b/src/main.rs
index 77a41a6..cbc92a6 100644
--- a/src/main.rs
+++ b/src/main.rs
@@ -37,6 +37,7 @@ mod item;
mod exchange;
mod errors;
mod auth;
+mod fromtoparameter;
use self::{
pos::Pos,
diff --git a/src/parameter.rs b/src/parameter.rs
index 8df7625..cee6342 100644
--- a/src/parameter.rs
+++ b/src/parameter.rs
@@ -114,116 +114,6 @@ impl Parameter {
}
}
-pub trait FromToParameter: Sized {
- fn from_parameter(p: Parameter) -> Option<Self>;
- fn to_parameter(self) -> Parameter;
-}
-
-
-
-impl FromToParameter for Parameter {
- fn from_parameter(p: Parameter) -> Option<Self>{
- Some(p)
- }
- fn to_parameter(self) -> Parameter {
- self
- }
-}
-
-macro_rules! tofrom {
- ($paramtyp: ident $typ: ty) => {
- impl FromToParameter for $typ {
- fn from_parameter(p: Parameter) -> Option<Self>{
- if let Parameter::$paramtyp(i) = p {
- Some(i)
- } else {
- None
- }
- }
- fn to_parameter(self) -> Parameter {
- Parameter::$paramtyp(self)
- }
- }
- }
-}
-
-tofrom!(Int i64);
-tofrom!(Float f64);
-tofrom!(Bool bool);
-tofrom!(String String);
-tofrom!(Pos Pos);
-tofrom!(Template Template);
-tofrom!(Interaction Interactable);
-
-
-impl<T> FromToParameter for Vec<T>
-where
- T: FromToParameter,
-{
- fn from_parameter(p: Parameter) -> Option<Self>{
- if let Parameter::List(items) = p{
- let mut v = Self::new();
- for item in items {
- if let Some(t) = T::from_parameter(item){
- v.push(t);
- } else {
- return None;
- }
- }
- Some(v)
- } else {
- None
- }
- }
- fn to_parameter(self) -> Parameter {
- Parameter::List(self.into_iter().map(|item| item.to_parameter()).collect())
- }
-}
-
-impl<T, U> FromToParameter for (T, U)
-where
- T: FromToParameter,
- U: FromToParameter,
-{
- fn from_parameter(p: Parameter) -> Option<Self> {
- if let Parameter::List(mut items) = p {
- if items.len() == 2 {
- return Some((
- T::from_parameter(items.remove(0))?,
- U::from_parameter(items.remove(0))?
- ))
- }
- }
- None
- }
- fn to_parameter(self) -> Parameter {
- Parameter::List(vec![self.0.to_parameter(), self.1.to_parameter()])
- }
-}
-
-impl<T, U, V> FromToParameter for (T, U, V)
-where
- T: FromToParameter,
- U: FromToParameter,
- V: FromToParameter,
-{
- fn from_parameter(p: Parameter) -> Option<Self> {
- if let Parameter::List(mut items) = p {
- if items.len() == 3 {
- return Some((
- T::from_parameter(items.remove(0))?,
- U::from_parameter(items.remove(0))?,
- V::from_parameter(items.remove(0))?
- ))
- }
- }
- None
- }
- fn to_parameter(self) -> Parameter {
- Parameter::List(vec![self.0.to_parameter(), self.1.to_parameter(), self.2.to_parameter()])
- }
-}
-
#[cfg(test)]
mod tests {
use super::*;