From 5e217c7faad49fd80b2a0564342b32c4570751a8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?W=C3=B6lfchen?= <115360611+W-lfchen@users.noreply.github.com> Date: Sun, 27 Oct 2024 18:05:11 +0100 Subject: [PATCH] refactor: improve run_jaq_function --- crates/simplexpr/src/eval.rs | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/crates/simplexpr/src/eval.rs b/crates/simplexpr/src/eval.rs index 5b24cc1b..d75c2c49 100644 --- a/crates/simplexpr/src/eval.rs +++ b/crates/simplexpr/src/eval.rs @@ -525,17 +525,15 @@ fn prepare_jaq_filter(code: String) -> Result, EvalEr } fn run_jaq_function(json: serde_json::Value, code: String, args: &str) -> Result { - let inputs = jaq_interpret::RcIter::new(std::iter::empty()); + use jaq_interpret::{Ctx, RcIter, Val}; prepare_jaq_filter(code)? - .run((jaq_interpret::Ctx::new([], &inputs), jaq_interpret::Val::from(json))) + .run((Ctx::new([], &RcIter::new(std::iter::empty())), Val::from(json))) .map(|r| r.map(Into::::into)) - .map(|r| { - r.map(|v| match v { - // Per jq docs, "raw-output" behavior simply omits - // quotation marks from strings, and outputs what would - // otherwise be valid JSON, so this should replicate that. - serde_json::Value::String(contents) if args == "r" => DynVal::from_string(contents), - anyval => DynVal::from_string(serde_json::to_string(&anyval).unwrap()), + .map(|x| { + x.map(|val| match (args, val) { + ("r", serde_json::Value::String(s)) => DynVal::from_string(s), + // invalid arguments are silently ignored + (_, v) => DynVal::from_string(serde_json::to_string(&v).unwrap()), }) }) .collect::>()