feat: zen expression rewrite (#107)

* temp: zen-expression rewrite

* rewrite standard parser

* stabilise parser, upgrade dependencies

* implement unary parser

* align builtin behavior

* fix tests and minor bugs

* refactor exports, update docs

* fix expression repl

* cleanup

* cleanup vm

* replace expression with expression-rewrite

* update d.ts file

* fix failing test
This commit is contained in:
stefan-gorules
2023-12-12 08:50:25 +01:00
committed by GitHub
parent c27e9a6ed9
commit 5f423b7910
55 changed files with 2570 additions and 2119 deletions
+8 -31
View File
@@ -4,8 +4,6 @@ use pyo3::{pyfunction, PyObject, PyResult, Python, ToPyObject};
use pythonize::depythonize;
use serde_json::Value;
use zen_expression::isolate::Isolate;
use crate::value::PyValue;
#[pyfunction]
@@ -14,45 +12,24 @@ pub fn evaluate_expression(
expression: String,
ctx: Option<&PyDict>,
) -> PyResult<PyObject> {
let isolate = Isolate::default();
let ctx = ctx
let context = ctx
.map(|ctx| depythonize(ctx))
.transpose()
.context("Failed to convert context")?;
.context("Failed to convert context")?
.unwrap_or(Value::Null);
if let Some(env_value) = ctx {
isolate.inject_env(&env_value);
}
let result = isolate
.run_standard(expression.as_str())
let result = zen_expression::evaluate_expression(expression.as_str(), &context)
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
Ok(PyValue(result).to_object(py))
}
#[pyfunction]
pub fn evaluate_unary_expression(
py: Python,
expression: String,
ctx: &PyDict,
) -> PyResult<PyObject> {
let env_value: Value = depythonize(ctx).context("Failed to convert context")?;
pub fn evaluate_unary_expression(expression: String, ctx: &PyDict) -> PyResult<bool> {
let context: Value = depythonize(ctx).context("Failed to convert context")?;
let Some(env_object) = env_value.as_object() else {
return Err(anyhow!("Context must be an object").into());
};
if !env_object.contains_key("$") {
return Err(anyhow!("Context must contain '$' reference.").into());
}
let isolate = Isolate::default();
isolate.inject_env(&env_value);
let result = isolate
.run_unary(expression.as_str())
let result = zen_expression::evaluate_unary_expression(expression.as_str(), &context)
.map_err(|e| anyhow!(serde_json::to_string(&e).unwrap_or_else(|_| e.to_string())))?;
Ok(PyValue(result).to_object(py))
Ok(result)
}