use crate::jsonpath::ast::literal::{Literal, Number};
impl Literal {
pub fn eval(&self) -> serde_json::Value {
match self {
Literal::String(s) => serde_json::Value::String(s.clone()),
Literal::Number(n) => n.eval(),
Literal::Bool(b) => serde_json::Value::Bool(*b),
Literal::Null => serde_json::Value::Null,
}
}
}
impl Number {
pub fn eval(&self) -> serde_json::Value {
match self {
Number::Integer(n) => serde_json::Number::from_i128(*n as i128).unwrap().into(),
Number::BigInteger(s) => serde_json::Number::from_string_unchecked(s.clone()).into(),
Number::Float(n) => {
serde_json::Value::Number(serde_json::Number::from_f64(*n).unwrap())
}
}
}
}
#[cfg(test)]
mod tests {
use crate::jsonpath::ast::literal::{Literal, Number};
#[test]
pub fn test_number() {
let value1 = Literal::Number(Number::Float(110.0)).eval();
assert_eq!(value1, serde_json::json!(110.0));
let value2 = Literal::Number(Number::Float(110.00000000000001)).eval();
assert_eq!(value2, serde_json::json!(110.00000000000001));
assert!(value1 != value2);
let value1 = Literal::Number(Number::Integer(42)).eval();
assert_eq!(value1, serde_json::json!(42));
let value1 = Literal::Number(Number::BigInteger("99999999999".to_string())).eval();
assert_eq!(
value1,
serde_json::Value::Number(serde_json::Number::from_string_unchecked(
"99999999999".to_string()
))
);
}
}