diff options
Diffstat (limited to 'src/parameter.rs')
| -rw-r--r-- | src/parameter.rs | 108 |
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 { |
