Open
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Description:
This PR introduces a new method
run_jsontoJqProgramthat allows executing jq filters directly againstserde_json::Valueinputs, bypassing the overhead of string serialization and parsing.Currently, the crate requires users to serialize data to a JSON string before execution and parse the resulting string back into JSON. For high-throughput middleware or hot paths, this double-parsing (Rust -> String -> jq-internal -> String -> Rust) is a significant bottleneck.
Changes:
JV::from_serdeandJV::to_serdeto mapserde_json::Valuetypes directly to/fromlibjq'sjvpointers via FFI.JqProgram::run_json(&mut self, data: &serde_json::Value) -> Result<serde_json::Value>.serde_jsonfrom[dev-dependencies]to[dependencies]to support these public API types.libjq(which treats all numbers asf64) and convert them toserde_jsonIntegers. This ensures the output matches standardjqCLI behavior and prevents strict equality checks from failing in downstream Rust code.Performance:
By eliminating the intermediate string allocation and parsing steps, this implementation significantly reduces CPU usage and memory churn.
Safety:
jv_copyduring FFI conversions to correctly managelibjqreference counting and prevent double-free or use-after-free errors.jv_invalidstates is performed correctly at the end of the iteration loop to prevent assertion failures injv_invalid_has_msg.Verification:
42) are correctly returned as integers (42) rather than floats (42.0).