Skip to content

Commit c365155

Browse files
committed
Use raw scalar output for --jq to match gh --jq behavior
1 parent 6ab7264 commit c365155

3 files changed

Lines changed: 76 additions & 1 deletion

File tree

src/main.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
100100
Some(expr) => {
101101
let results = jq::apply(expr, &value)?;
102102
for v in &results {
103-
output::print_json(v, json_mode).map_err(|e| {
103+
output::print_jq_value(v).map_err(|e| {
104104
let err = error::CliError::ApiError {
105105
message: format!("Output error: {}", e),
106106
};

src/output.rs

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,3 +9,17 @@ pub fn print_json(value: &Value, json_mode: bool) -> Result<(), Box<dyn std::err
99
}
1010
Ok(())
1111
}
12+
13+
/// Print a jq result value with raw scalar output (like gh --jq / jq -r).
14+
/// Strings are printed unquoted, numbers as plain text, booleans as true/false,
15+
/// null as empty string. Objects and arrays are JSON-encoded.
16+
pub fn print_jq_value(value: &Value) -> Result<(), Box<dyn std::error::Error>> {
17+
match value {
18+
Value::String(s) => println!("{}", s),
19+
Value::Number(n) => println!("{}", n),
20+
Value::Bool(b) => println!("{}", b),
21+
Value::Null => println!(),
22+
_ => println!("{}", serde_json::to_string_pretty(value)?),
23+
}
24+
Ok(())
25+
}

tests/integration_tests.rs

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,67 @@ mod output_tests {
223223
}
224224
}
225225

226+
227+
mod print_jq_value_tests {
228+
use super::*;
229+
use serpapi_cli::output::print_jq_value;
230+
231+
#[test]
232+
fn test_print_jq_value_string() {
233+
let val = json!("hello world");
234+
let result = print_jq_value(&val);
235+
assert!(result.is_ok());
236+
}
237+
238+
#[test]
239+
fn test_print_jq_value_number_integer() {
240+
let val = json!(42);
241+
let result = print_jq_value(&val);
242+
assert!(result.is_ok());
243+
}
244+
245+
#[test]
246+
fn test_print_jq_value_number_float() {
247+
let val = json!(3.14);
248+
let result = print_jq_value(&val);
249+
assert!(result.is_ok());
250+
}
251+
252+
#[test]
253+
fn test_print_jq_value_bool_true() {
254+
let val = json!(true);
255+
let result = print_jq_value(&val);
256+
assert!(result.is_ok());
257+
}
258+
259+
#[test]
260+
fn test_print_jq_value_bool_false() {
261+
let val = json!(false);
262+
let result = print_jq_value(&val);
263+
assert!(result.is_ok());
264+
}
265+
266+
#[test]
267+
fn test_print_jq_value_null() {
268+
let val = json!(null);
269+
let result = print_jq_value(&val);
270+
assert!(result.is_ok());
271+
}
272+
273+
#[test]
274+
fn test_print_jq_value_object() {
275+
let val = json!({"key": "value"});
276+
let result = print_jq_value(&val);
277+
assert!(result.is_ok());
278+
}
279+
280+
#[test]
281+
fn test_print_jq_value_array() {
282+
let val = json!([1, 2, 3]);
283+
let result = print_jq_value(&val);
284+
assert!(result.is_ok());
285+
}
286+
}
226287
mod jq_tests {
227288
use super::*;
228289
use serpapi_cli::jq;

0 commit comments

Comments
 (0)