///|
/// Evaluate GetPath
fn eval_get_path(
path_expr : Expr,
input : Json,
env : Env,
) -> Iter[Json] raise InterpreterError {
match eval_with_env(path_expr, input, env).collect() {
[Array(path_arr), ..] =>
match get_at_path(input, path_arr) {
Some(value) => Iter::singleton(value)
None => Iter::singleton(null)
}
_ => Iter::singleton(null)
}
}
///|
fn get_at_path(current : Json, path : ArrayView[Json]) -> Json? {
match path {
[] => Some(current)
[segment, .. rest] =>
match (current, segment) {
(Object(obj), String(key)) =>
match obj.get(key) {
Some(v) => get_at_path(v, rest)
None => None
}
(Array(arr), Number(idx, ..)) => {
let i = idx.to_int()
if i >= 0 && i < arr.length() {
get_at_path(arr[i], rest)
} else {
None
}
}
_ => None
}
}
}
///|
/// Evaluate Path (placeholder)
fn eval_path(_expr : Expr) -> Iter[Json] {
Iter::singleton(Json::array([]))
}