From dcbf8e83f609bd0b947126af15bd520a2a83c15e Mon Sep 17 00:00:00 2001 From: Tom Alexander Date: Sat, 13 Jun 2020 19:55:40 -0400 Subject: [PATCH] Implement number casting. --- src/bin.rs | 17 ++++++++++++++++- src/renderer/parameters_context.rs | 19 ++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/src/bin.rs b/src/bin.rs index 5c36944..fdde0a1 100644 --- a/src/bin.rs +++ b/src/bin.rs @@ -315,7 +315,22 @@ impl Loopable for serde_json::Value { impl Castable for serde_json::Value { fn cast_to_type<'a>(&'a self, target: &str) -> Option> { - todo!() + match (self, target) { + (serde_json::Value::String(text), "number") => text + .parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LPositiveInteger(num))) + .or_else(|_| { + text.parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LNegativeInteger(num))) + }) + .or_else(|_| { + text.parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LFloat(num))) + }) + .ok(), + (serde_json::Value::Number(_), "number") => Some(IceResult::from_borrowed(self)), + (_, _) => panic!("Unimplemented cast"), + } } } diff --git a/src/renderer/parameters_context.rs b/src/renderer/parameters_context.rs index 026cf68..c1240b5 100644 --- a/src/renderer/parameters_context.rs +++ b/src/renderer/parameters_context.rs @@ -170,7 +170,24 @@ impl Walkable for OwnedLiteral { impl Castable for OwnedLiteral { fn cast_to_type<'a>(&'a self, target: &str) -> Option> { - todo!() + match (self, target) { + (OwnedLiteral::LString(text), "number") => text + .parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LPositiveInteger(num))) + .or_else(|_| { + text.parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LNegativeInteger(num))) + }) + .or_else(|_| { + text.parse::() + .map(|num| IceResult::from_owned(OwnedLiteral::LFloat(num))) + }) + .ok(), + (OwnedLiteral::LPositiveInteger(_), "number") => Some(IceResult::from_borrowed(self)), + (OwnedLiteral::LNegativeInteger(_), "number") => Some(IceResult::from_borrowed(self)), + (OwnedLiteral::LFloat(_), "number") => Some(IceResult::from_borrowed(self)), + (_, _) => panic!("Unimplemented cast"), + } } }