Wire up serde_json for the math functions.
This commit is contained in:
parent
431b34dac7
commit
cdd10576e8
110
src/bin.rs
110
src/bin.rs
@ -441,31 +441,125 @@ impl CompareContextElement for serde_json::Value {
|
|||||||
}
|
}
|
||||||
|
|
||||||
fn math_subtract<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_subtract<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
let other_json = other.to_any().downcast_ref::<Self>();
|
||||||
|
let other_literal = other.to_any().downcast_ref::<OwnedLiteral>();
|
||||||
|
match (self, other_json, other_literal) {
|
||||||
|
// If its neither of those types, then it is unimplemented
|
||||||
|
(_, None, None) => panic!("Math operation on unimplemented type"),
|
||||||
|
// Since this is specifically for the math helper, non-primitives are not supported
|
||||||
|
(serde_json::Value::Array(_), _, _)
|
||||||
|
| (serde_json::Value::Object(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::Array(_)), _)
|
||||||
|
| (_, Some(serde_json::Value::Object(_)), _) => None,
|
||||||
|
// Strings also are ignored because this is specifically a math function
|
||||||
|
(serde_json::Value::String(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::String(_)), _)
|
||||||
|
| (_, _, Some(OwnedLiteral::LString(_))) => None,
|
||||||
|
// Handle other serde_json::Value
|
||||||
|
(_, Some(other_json_value), _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
- std::convert::Into::<MathNumber>::into(other_json_value))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
// Handle literals
|
||||||
|
(_, _, Some(other_literal)) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
- std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_multiply<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_multiply<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
let other_json = other.to_any().downcast_ref::<Self>();
|
||||||
|
let other_literal = other.to_any().downcast_ref::<OwnedLiteral>();
|
||||||
|
match (self, other_json, other_literal) {
|
||||||
|
// If its neither of those types, then it is unimplemented
|
||||||
|
(_, None, None) => panic!("Math operation on unimplemented type"),
|
||||||
|
// Since this is specifically for the math helper, non-primitives are not supported
|
||||||
|
(serde_json::Value::Array(_), _, _)
|
||||||
|
| (serde_json::Value::Object(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::Array(_)), _)
|
||||||
|
| (_, Some(serde_json::Value::Object(_)), _) => None,
|
||||||
|
// Strings also are ignored because this is specifically a math function
|
||||||
|
(serde_json::Value::String(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::String(_)), _)
|
||||||
|
| (_, _, Some(OwnedLiteral::LString(_))) => None,
|
||||||
|
// Handle other serde_json::Value
|
||||||
|
(_, Some(other_json_value), _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
* std::convert::Into::<MathNumber>::into(other_json_value))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
// Handle literals
|
||||||
|
(_, _, Some(other_literal)) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
* std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_divide<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_divide<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
let other_json = other.to_any().downcast_ref::<Self>();
|
||||||
|
let other_literal = other.to_any().downcast_ref::<OwnedLiteral>();
|
||||||
|
match (self, other_json, other_literal) {
|
||||||
|
// If its neither of those types, then it is unimplemented
|
||||||
|
(_, None, None) => panic!("Math operation on unimplemented type"),
|
||||||
|
// Since this is specifically for the math helper, non-primitives are not supported
|
||||||
|
(serde_json::Value::Array(_), _, _)
|
||||||
|
| (serde_json::Value::Object(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::Array(_)), _)
|
||||||
|
| (_, Some(serde_json::Value::Object(_)), _) => None,
|
||||||
|
// Strings also are ignored because this is specifically a math function
|
||||||
|
(serde_json::Value::String(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::String(_)), _)
|
||||||
|
| (_, _, Some(OwnedLiteral::LString(_))) => None,
|
||||||
|
// Handle other serde_json::Value
|
||||||
|
(_, Some(other_json_value), _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
/ std::convert::Into::<MathNumber>::into(other_json_value))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
// Handle literals
|
||||||
|
(_, _, Some(other_literal)) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
/ std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_modulus<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
fn math_modulus<'a>(&self, other: &dyn ContextElement) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
let other_json = other.to_any().downcast_ref::<Self>();
|
||||||
|
let other_literal = other.to_any().downcast_ref::<OwnedLiteral>();
|
||||||
|
match (self, other_json, other_literal) {
|
||||||
|
// If its neither of those types, then it is unimplemented
|
||||||
|
(_, None, None) => panic!("Math operation on unimplemented type"),
|
||||||
|
// Since this is specifically for the math helper, non-primitives are not supported
|
||||||
|
(serde_json::Value::Array(_), _, _)
|
||||||
|
| (serde_json::Value::Object(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::Array(_)), _)
|
||||||
|
| (_, Some(serde_json::Value::Object(_)), _) => None,
|
||||||
|
// Strings also are ignored because this is specifically a math function
|
||||||
|
(serde_json::Value::String(_), _, _)
|
||||||
|
| (_, Some(serde_json::Value::String(_)), _)
|
||||||
|
| (_, _, Some(OwnedLiteral::LString(_))) => None,
|
||||||
|
// Handle other serde_json::Value
|
||||||
|
(_, Some(other_json_value), _) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
% std::convert::Into::<MathNumber>::into(other_json_value))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
// Handle literals
|
||||||
|
(_, _, Some(other_literal)) => (std::convert::Into::<MathNumber>::into(self)
|
||||||
|
% std::convert::Into::<MathNumber>::into(other_literal))
|
||||||
|
.map(IceResult::from_owned),
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_abs<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_abs<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_abs()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_floor<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_floor<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_floor()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
|
|
||||||
fn math_ceil<'a>(&self) -> Option<IceResult<'a>> {
|
fn math_ceil<'a>(&self) -> Option<IceResult<'a>> {
|
||||||
todo!()
|
std::convert::Into::<MathNumber>::into(self)
|
||||||
|
.math_ceil()
|
||||||
|
.map(IceResult::from_owned)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -630,7 +724,7 @@ impl From<&serde_json::Value> for MathNumber {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
serde_json::Value::Number(num) => num.into(),
|
serde_json::Value::Number(num) => num.into(),
|
||||||
serde_json::Value::String(text) => {
|
serde_json::Value::String(_) => {
|
||||||
panic!("Strings should not be cast to numbers for math")
|
panic!("Strings should not be cast to numbers for math")
|
||||||
}
|
}
|
||||||
serde_json::Value::Array(_) => {
|
serde_json::Value::Array(_) => {
|
||||||
|
@ -233,7 +233,7 @@ impl CompareContextElement for OwnedLiteral {
|
|||||||
OwnedLiteral::LNegativeInteger(self_num),
|
OwnedLiteral::LNegativeInteger(self_num),
|
||||||
OwnedLiteral::LNegativeInteger(other_num),
|
OwnedLiteral::LNegativeInteger(other_num),
|
||||||
) => self_num == other_num,
|
) => self_num == other_num,
|
||||||
(OwnedLiteral::LString(self_text), _) | (_, OwnedLiteral::LString(self_text)) => {
|
(OwnedLiteral::LString(_self_text), _) | (_, OwnedLiteral::LString(_self_text)) => {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
(OwnedLiteral::LFloat(self_num), OwnedLiteral::LFloat(other_num)) => {
|
(OwnedLiteral::LFloat(self_num), OwnedLiteral::LFloat(other_num)) => {
|
||||||
|
Loading…
Reference in New Issue
Block a user