diff options
| author | troido <troido@protonmail.com> | 2020-09-28 14:29:53 +0200 |
|---|---|---|
| committer | troido <troido@protonmail.com> | 2020-09-28 14:29:53 +0200 |
| commit | eb9853dec24045adb7447e1c8ac186e52204b690 (patch) | |
| tree | 7fb944311d64ca5a8ff41748fbd5209a2eaf9806 /src/fromtoparameter.rs | |
| parent | 25abc71200803f7238c56c93b8b89160ff6c1086 (diff) | |
removed parametertype
Diffstat (limited to 'src/fromtoparameter.rs')
| -rw-r--r-- | src/fromtoparameter.rs | 49 |
1 files changed, 42 insertions, 7 deletions
diff --git a/src/fromtoparameter.rs b/src/fromtoparameter.rs index 13483d7..180632f 100644 --- a/src/fromtoparameter.rs +++ b/src/fromtoparameter.rs @@ -1,6 +1,7 @@ use std::collections::{HashSet, HashMap}; use std::hash::Hash; +use std::str::FromStr; use crate::{ parameter::Parameter, Template, @@ -8,7 +9,9 @@ use crate::{ PlayerId, Sprite, ItemId, - RoomId + RoomId, + components::{Trigger}, + Timestamp }; pub trait FromToParameter: Sized { @@ -82,11 +85,26 @@ tofrom!(PlayerId(String)); tofrom!(Sprite(String)); tofrom!(ItemId(String)); tofrom!(RoomId(String)); +tofrom!(Timestamp(Int)); + + +macro_rules! fromtostr { + ($t: ty) => { + impl FromToParameter for $t { + fn from_parameter(p: Parameter) -> Option<Self>{ + <$t>::from_str(&String::from_parameter(p)?).ok() + } + fn to_parameter(self) -> Parameter { + self.to_string().to_parameter() + } + } + } +} + +fromtostr!(Trigger); impl<T> FromToParameter for Vec<T> -where - T: FromToParameter, -{ +where T: FromToParameter { fn from_parameter(p: Parameter) -> Option<Self>{ if let Parameter::List(items) = p{ let mut v = Self::new(); @@ -108,9 +126,7 @@ where } impl<T> FromToParameter for HashSet<T> -where - T: FromToParameter + Eq + Hash, -{ +where T: FromToParameter + Eq + Hash { fn from_parameter(p: Parameter) -> Option<Self>{ Some(<Vec<T>>::from_parameter(p)?.into_iter().collect()) } @@ -186,3 +202,22 @@ impl FromToParameter for Pos { (self.x, self.y).to_parameter() } } + +impl<T> FromToParameter for Option<T> +where T: FromToParameter { + fn from_parameter(p: Parameter) -> Option<Self>{ + if p == Parameter::List(Vec::new()) { + Some(None) + } else { + Some(Some(T::from_parameter(p)?)) + } + } + fn to_parameter(self) -> Parameter { + if let Some(p) = self { + p.to_parameter() + } else { + Parameter::List(Vec::new()) + } + } +} + |
