diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/componentwrapper.rs | 17 | ||||
| -rw-r--r-- | src/fromtoparameter.rs | 152 | ||||
| -rw-r--r-- | src/main.rs | 1 | ||||
| -rw-r--r-- | src/parameter.rs | 110 |
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::*; |
