@@ -45,6 +45,14 @@ fn main() {
4545 . takes_value ( true )
4646 . possible_values ( format_ids. as_slice ( ) ) ,
4747 )
48+ . arg (
49+ Arg :: with_name ( "query" )
50+ . short ( "q" )
51+ . long ( "query" )
52+ . value_name ( "QUERY" )
53+ . help ( "JMES query to apply to each input file" )
54+ . takes_value ( true ) ,
55+ )
4856 . arg (
4957 Arg :: with_name ( "output-format" )
5058 . short ( "F" )
@@ -233,7 +241,7 @@ fn run(
233241 } ,
234242 } ;
235243
236- let values = match format. parse ( reader) {
244+ let mut values = match format. parse ( reader) {
237245 Ok ( values) => values,
238246 Err ( e) => {
239247 return Err ( EachError :: Data {
@@ -242,9 +250,27 @@ fn run(
242250 }
243251 } ;
244252
253+ if let Some ( query_str) = arg_matches. value_of ( "query" ) {
254+ let query = jmespath:: compile ( & query_str) . map_err ( |e| EachError :: Usage {
255+ message : format ! ( "Invalid JMES query: {}" , e) ,
256+ } ) ?;
257+
258+ let query_result = query. search ( values) . map_err ( |e| EachError :: Data {
259+ message : format ! ( "Error evaluating JMES query: {}" , e) ,
260+ } ) ?;
261+
262+ values = serde_json:: to_value ( query_result) . map_err ( |e| EachError :: Data {
263+ message : format ! ( "Error converting query result to JSON value: {}" , e) ,
264+ } ) ?;
265+ }
266+
267+ let vec_values = values. as_array ( ) . ok_or_else ( || EachError :: Data {
268+ message : "Input values are not an array" . to_string ( ) ,
269+ } ) ?;
270+
245271 match action {
246- Some ( ref action) => process ( & values , & action) ?,
247- None => output_values. extend_from_slice ( & values ) ,
272+ Some ( ref action) => process ( & vec_values , & action) ?,
273+ None => output_values. extend_from_slice ( & vec_values ) ,
248274 }
249275 }
250276
0 commit comments