Move MathNumber into the library.
While this will be used for the OwnedLiterals since they must always exhibit the original DustJS behavior, I am going to keep exposing separate math functions for ContextElement instead of simply requiring them to implement Into<MathNumber> since people might want to implement math in unusual ways with unusual types.
This commit is contained in:
45
src/bin.rs
45
src/bin.rs
@@ -5,13 +5,13 @@ use parser::Filter;
|
||||
use parser::OwnedLiteral;
|
||||
use parser::Template;
|
||||
use renderer::compile_template;
|
||||
use renderer::math_ints;
|
||||
use renderer::CompileError;
|
||||
use renderer::ContextElement;
|
||||
use renderer::DustRenderer;
|
||||
use renderer::IceResult;
|
||||
use renderer::IntoContextElement;
|
||||
use renderer::Loopable;
|
||||
use renderer::MathNumber;
|
||||
use renderer::RenderError;
|
||||
use renderer::Renderable;
|
||||
use renderer::Truthiness;
|
||||
@@ -22,7 +22,6 @@ use std::convert::TryInto;
|
||||
use std::env;
|
||||
use std::fs;
|
||||
use std::io::{self, Read};
|
||||
use std::ops::Add;
|
||||
use std::path::Path;
|
||||
|
||||
mod parser;
|
||||
@@ -561,13 +560,6 @@ where
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
enum MathNumber {
|
||||
Integer(i128),
|
||||
Decimal(f64),
|
||||
Failure,
|
||||
}
|
||||
|
||||
impl From<&serde_json::Value> for MathNumber {
|
||||
fn from(original: &serde_json::Value) -> Self {
|
||||
match original {
|
||||
@@ -611,41 +603,6 @@ impl From<&serde_json::Number> for MathNumber {
|
||||
}
|
||||
}
|
||||
|
||||
impl From<&OwnedLiteral> for MathNumber {
|
||||
fn from(original: &OwnedLiteral) -> Self {
|
||||
match original {
|
||||
OwnedLiteral::LString(_) => panic!("Strings should not be cast to numbers for math"),
|
||||
OwnedLiteral::LPositiveInteger(num) => {
|
||||
return MathNumber::Integer((*num).try_into().unwrap())
|
||||
}
|
||||
OwnedLiteral::LNegativeInteger(num) => return MathNumber::Integer((*num).into()),
|
||||
OwnedLiteral::LFloat(num) => return MathNumber::Decimal(*num),
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl Add<MathNumber> for MathNumber {
|
||||
type Output = Option<OwnedLiteral>;
|
||||
|
||||
fn add(self, other: MathNumber) -> Self::Output {
|
||||
match (self, other) {
|
||||
(MathNumber::Failure, _) | (_, MathNumber::Failure) => None,
|
||||
(MathNumber::Integer(self_num), MathNumber::Integer(other_num)) => {
|
||||
math_ints(self_num, other_num, std::ops::Add::add)
|
||||
}
|
||||
(MathNumber::Decimal(self_num), MathNumber::Decimal(other_num)) => {
|
||||
Some(OwnedLiteral::LFloat(self_num + other_num))
|
||||
}
|
||||
(MathNumber::Integer(self_num), MathNumber::Decimal(other_num)) => {
|
||||
Some(OwnedLiteral::LFloat((self_num as f64) + other_num))
|
||||
}
|
||||
(MathNumber::Decimal(self_num), MathNumber::Integer(other_num)) => {
|
||||
Some(OwnedLiteral::LFloat(self_num + (other_num as f64)))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use super::*;
|
||||
|
||||
Reference in New Issue
Block a user