ksql 2.0.0

A JSON data expression lexer, parser, cli and library
Documentation
use crate::parser::parse::BoxedExpression;
use crate::parser::{Error, Expression, Value};

#[derive(Debug)]
pub(in crate::parser) struct COERCENumber {
    pub value: BoxedExpression,
}

impl Expression for COERCENumber {
    #[allow(clippy::cast_precision_loss)]
    fn calculate(&self, json: &[u8]) -> crate::parser::parse::Result<Value> {
        let value = self.value.calculate(json)?;
        match value {
            Value::String(s) => Ok(Value::Number(
                s.parse::<f64>()
                    .map_err(|e| Error::UnsupportedCOERCE(e.to_string()))?,
            )),
            Value::Number(num) => Ok(Value::Number(num)),
            Value::Bool(b) => Ok(Value::Number(if b { 1.0 } else { 0.0 })),
            Value::DateTime(dt) => Ok(Value::Number(
                dt.timestamp_nanos_opt().unwrap_or_default() as f64
            )),
            _ => Err(Error::UnsupportedCOERCE(
                format!("{value} COERCE datetime",),
            )),
        }
    }
}