@@ -6,6 +6,7 @@ mod output;
66mod error;
77mod config;
88mod params;
9+ mod jq;
910
1011#[ derive( Parser , Debug ) ]
1112#[ command(
@@ -21,6 +22,11 @@ struct Cli {
2122 #[ arg( long) ]
2223 json : bool ,
2324
25+ /// Server-side field filtering (SerpApi json_restrictor parameter)
26+ #[ arg( long) ]
27+ fields : Option < String > ,
28+
29+ /// Client-side jq filter applied to JSON output (like gh --jq)
2430 #[ arg( long) ]
2531 jq : Option < String > ,
2632
@@ -48,7 +54,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
4854 let cli = Cli :: parse ( ) ;
4955 let json_mode = cli. json ;
5056
51- match cli. command {
57+ let result = match cli. command {
5258 Command :: Search { params } => {
5359 let api_key = config:: resolve_api_key (
5460 cli. api_key . as_deref ( ) ,
@@ -57,47 +63,55 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
5763 let parsed_params = params. iter ( )
5864 . map ( |s| params:: Param :: from_str ( s) )
5965 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
60- if let Err ( e) = commands:: search:: run ( parsed_params, & api_key, json_mode, cli. jq . as_deref ( ) ) . await {
61- error:: print_error ( & e) ;
62- std:: process:: exit ( error:: exit_code ( & e) ) ;
63- }
66+ commands:: search:: run ( parsed_params, & api_key, cli. fields . as_deref ( ) ) . await
6467 } ,
6568 Command :: Account => {
6669 let api_key = config:: resolve_api_key (
6770 cli. api_key . as_deref ( ) ,
6871 std:: env:: var ( "SERPAPI_KEY" ) . ok ( ) . as_deref ( )
6972 ) ?;
70- if let Err ( e) = commands:: account:: run ( & api_key, json_mode) . await {
71- error:: print_error ( & e) ;
72- std:: process:: exit ( error:: exit_code ( & e) ) ;
73- }
73+ commands:: account:: run ( & api_key) . await
7474 } ,
7575 Command :: Locations { params } => {
7676 let parsed_params = params. iter ( )
7777 . map ( |s| params:: Param :: from_str ( s) )
7878 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
79- if let Err ( e) = commands:: locations:: run ( parsed_params, json_mode) . await {
80- error:: print_error ( & e) ;
81- std:: process:: exit ( error:: exit_code ( & e) ) ;
82- }
79+ commands:: locations:: run ( parsed_params) . await
8380 } ,
8481 Command :: Archive { id } => {
8582 let api_key = config:: resolve_api_key (
8683 cli. api_key . as_deref ( ) ,
8784 std:: env:: var ( "SERPAPI_KEY" ) . ok ( ) . as_deref ( )
8885 ) ?;
89- if let Err ( e) = commands:: archive:: run ( & id, & api_key, json_mode) . await {
90- error:: print_error ( & e) ;
91- std:: process:: exit ( error:: exit_code ( & e) ) ;
92- }
86+ commands:: archive:: run ( & id, & api_key) . await
9387 } ,
9488 Command :: Login => {
9589 if let Err ( e) = commands:: login:: run ( ) . await {
9690 error:: print_error ( & e) ;
9791 std:: process:: exit ( error:: exit_code ( & e) ) ;
9892 }
93+ return Ok ( ( ) ) ;
9994 } ,
100- }
95+ } ;
10196
97+ match result {
98+ Ok ( value) => {
99+ let filtered = match cli. jq . as_deref ( ) {
100+ Some ( expr) => jq:: apply ( expr, & value) ?,
101+ None => value,
102+ } ;
103+ output:: print_json ( & filtered, json_mode) . map_err ( |e| {
104+ let err = error:: CliError :: ApiError {
105+ message : format ! ( "Output error: {}" , e) ,
106+ } ;
107+ error:: print_error ( & err) ;
108+ std:: process:: exit ( error:: exit_code ( & err) ) ;
109+ } ) . ok ( ) ;
110+ }
111+ Err ( e) => {
112+ error:: print_error ( & e) ;
113+ std:: process:: exit ( error:: exit_code ( & e) ) ;
114+ }
115+ }
102116 Ok ( ( ) )
103117}
0 commit comments