Add json_get_raw builtin to El VM
Adds json_get_raw(value, key) -> String that serializes any JSON field (including nested objects and arrays) back to a JSON string. Existing json_get_string only handles primitive string values. This enables traversing nested JSON structures in El programs. Also registers json_get_raw in is_builtin().
This commit is contained in:
+40
-1
@@ -4187,6 +4187,45 @@ fn dispatch_builtin(
|
|||||||
BuiltinResult::Handled
|
BuiltinResult::Handled
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ── JSON raw field extractor ──────────────────────────────────────────
|
||||||
|
// json_get_raw(json_str_or_struct, key) -> String
|
||||||
|
// Returns the JSON-serialized value at key, including objects and arrays.
|
||||||
|
// Unlike json_get_string which only handles primitive strings, this works
|
||||||
|
// for any JSON type and always returns a valid JSON string.
|
||||||
|
"json_get_raw" => {
|
||||||
|
let key = match stack.pop().unwrap_or(Value::Nil) {
|
||||||
|
Value::Str(s) => s,
|
||||||
|
_ => String::new(),
|
||||||
|
};
|
||||||
|
let v = stack.pop().unwrap_or(Value::Nil);
|
||||||
|
let result = match &v {
|
||||||
|
Value::Map(pairs) => pairs.iter()
|
||||||
|
.find(|(k, _)| k == &key)
|
||||||
|
.map(|(_, v)| {
|
||||||
|
let jv = el_value_to_json_value(v);
|
||||||
|
serde_json::to_string(&jv).unwrap_or_default()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
|
Value::Struct { fields, .. } => fields.iter()
|
||||||
|
.find(|(k, _)| k == &key)
|
||||||
|
.map(|(_, v)| {
|
||||||
|
let jv = el_value_to_json_value(v);
|
||||||
|
serde_json::to_string(&jv).unwrap_or_default()
|
||||||
|
})
|
||||||
|
.unwrap_or_default(),
|
||||||
|
Value::Str(json_str) => {
|
||||||
|
serde_json::from_str::<serde_json::Value>(json_str)
|
||||||
|
.ok()
|
||||||
|
.and_then(|jv| jv.get(&key).cloned())
|
||||||
|
.map(|v| serde_json::to_string(&v).unwrap_or_default())
|
||||||
|
.unwrap_or_default()
|
||||||
|
}
|
||||||
|
_ => String::new(),
|
||||||
|
};
|
||||||
|
stack.push(Value::Str(result));
|
||||||
|
BuiltinResult::Handled
|
||||||
|
}
|
||||||
|
|
||||||
// ── HTTP auth builtins (Bearer token) ─────────────────────────────────
|
// ── HTTP auth builtins (Bearer token) ─────────────────────────────────
|
||||||
|
|
||||||
"http_get_auth" => {
|
"http_get_auth" => {
|
||||||
@@ -6521,7 +6560,7 @@ fn is_builtin(name: &str) -> bool {
|
|||||||
| "hash_sha256" | "blake3_hash"
|
| "hash_sha256" | "blake3_hash"
|
||||||
| "float_to_str" | "int_to_str" | "str_to_int" | "str_to_float" | "parse_float" | "parse_int" | "bool_to_str"
|
| "float_to_str" | "int_to_str" | "str_to_int" | "str_to_float" | "parse_float" | "parse_int" | "bool_to_str"
|
||||||
| "bytes_to_str" | "str_to_bytes"
|
| "bytes_to_str" | "str_to_bytes"
|
||||||
| "json_get" | "json_get_int" | "json_get_string" | "json_get_array" | "json_get_bool" | "json_get_float"
|
| "json_get" | "json_get_int" | "json_get_string" | "json_get_array" | "json_get_bool" | "json_get_float" | "json_get_raw"
|
||||||
| "json_set" | "json_stringify" | "json_parse" | "json_encode" | "json_decode" | "json_keys"
|
| "json_set" | "json_stringify" | "json_parse" | "json_encode" | "json_decode" | "json_keys"
|
||||||
| "json_array_get" | "json_array_len" | "json_array_push"
|
| "json_array_get" | "json_array_len" | "json_array_push"
|
||||||
| "str_eq" | "str_split" | "str_contains" | "str_starts_with" | "str_ends_with" | "str_replace"
|
| "str_eq" | "str_split" | "str_contains" | "str_starts_with" | "str_ends_with" | "str_replace"
|
||||||
|
|||||||
Reference in New Issue
Block a user