summaryrefslogtreecommitdiff
path: root/src/parameter.rs
diff options
context:
space:
mode:
authortroido <troido@protonmail.com>2020-05-19 22:39:49 +0200
committertroido <troido@protonmail.com>2020-05-19 22:39:49 +0200
commit2987e76d5044bb6d4e18e76d11e274031af0f00e (patch)
treea881a2f47d50bf14b046120e5da05300b0e4304b /src/parameter.rs
parentdac89209fdde17e2e4fdf89768e814945a8cea62 (diff)
added function to convert common types from/to paramters
Diffstat (limited to 'src/parameter.rs')
-rw-r--r--src/parameter.rs108
1 files changed, 108 insertions, 0 deletions
diff --git a/src/parameter.rs b/src/parameter.rs
index 01a7f40..8df7625 100644
--- a/src/parameter.rs
+++ b/src/parameter.rs
@@ -114,7 +114,115 @@ 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 {