JSONata rewritten in moonbit.
moon build cmd/main --target nativemoon run --target native cmd/main '$sum(Account.Order.Product.(Price * Quantity))' --file cmd/main/test.json
_build/native/debug/build/cmd/main/main.exe '$sum(Account.Order.Product.(Price * Quantity))' --file cmd/main/test.jsonAccount.'Account Name' -> "Firefly"
$sum(Account.Order.Product.(Price * Quantity)) -> 336.36///|
let data = @json.parse("{\"items\":[{\"price\":10},{\"price\":20}]}")
///|
let result = @moonata.evaluate("$sum(items.price)", data)///|
let expr = @moonata.compile("$sum(items.price)")
///|
let result = expr.run(data)///|
// 注册自定义函数(含 JSONata 签名)
let expr = @moonata.compile("$add(61, 10005)")
expr.register_function("add", arity=2, signature=Some("<nn:n>"), invoke=fn(args, _ctx) {
match args[0] {
Json::Number(a, ..) =>
match args[1] {
Json::Number(b, ..) => Json::number(a + b)
_ => Json::null()
}
_ => Json::null()
}
})
///|
let result = expr.run(Json::null()) // 10066///|
let options = @moonata.EvalOptions::new(
stack=Some(500), // 最大递归深度,超限抛 D1011
timeout=Some(1000), // 最大执行时间毫秒,超限抛 D1012
sequence=Some(1_000_000), // 最大序列长度,超限抛 D2015
)
///|
let result = @moonata.evaluate_with_options("$sum(items.price)", data, options)moon check
moon test
moon fmt
moon infofeat(functions): add basic formatNumber support
fix(evaluator): align predicate context semantics
docs: update official test status本地测试:moon test 321/321
官方可比对审计:eligible 1682, pass 1682, fail 0, skip 0
通过率:100%fn Compiled::register_function(self : Compiled, name : String, arity~ : Int, signature~ : String?, invoke~ : (Array[Json], EvalContext) -> Json raise JsonataError) -> Unitfn Compiled::run_with_options(self : Compiled, data : Json, options : EvalOptions) -> Json raise JsonataErrorfn EvalOptions::new(stack? : Int?, timeout? : Int?, sequence? : Int?, max_steps? : Int?) -> EvalOptionsfn evaluate_with_bindings(expr : String, data : Json, bindings : Map[String, Json]) -> Json raise JsonataErrorfn evaluate_with_options(expr : String, data : Json, options : EvalOptions) -> Json raise JsonataError