diff options
| author | troido <troido@protonmail.com> | 2020-05-19 23:08:47 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-05-19 23:08:47 +0200 |
| commit | b7e3d2a51441a2c51d0cacd6f874fc8b260579e9 (patch) | |
| tree | a08f60934487807b7e650d7c965f020a6ad164e9 /src/fromtoparameter.rs | |
| parent | 2987e76d5044bb6d4e18e76d11e274031af0f00e (diff) | |
moved parameter conversions to their own file and added more conversions
Diffstat (limited to 'src/fromtoparameter.rs')
| -rw-r--r-- | src/fromtoparameter.rs | 152 |
1 files changed, 152 insertions, 0 deletions
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()]) + } +} |
