@@ -9,7 +9,10 @@ use filter::{FieldSpecifier, FilterConfig};
9
9
use log:: warn;
10
10
use serde_json:: Value ;
11
11
12
- use super :: { calculate_hash, data_display_options:: DataDisplayOptions } ;
12
+ use super :: {
13
+ calculate_hash,
14
+ data_display_options:: { DataDisplayOptions , RowParseErrorHandling } ,
15
+ } ;
13
16
mod data_iter;
14
17
pub mod filter;
15
18
@@ -364,8 +367,27 @@ impl TryFrom<(&DataDisplayOptions, usize, &str)> for LogRow {
364
367
fn try_from (
365
368
( data_display_options, row_idx_val, value) : ( & DataDisplayOptions , usize , & str ) ,
366
369
) -> Result < Self , Self :: Error > {
370
+ let data = match serde_json:: from_str :: < BTreeMap < String , Value > > ( value) {
371
+ Ok ( data) => data,
372
+ Err ( e) => match & data_display_options. row_parse_error_handling {
373
+ RowParseErrorHandling :: AbortOnAnyErrors => {
374
+ Err ( e) . context ( "Parse Error and mode is Abort On Error" ) ?
375
+ }
376
+ RowParseErrorHandling :: ConvertFailedLines {
377
+ raw_line_field_name,
378
+ parse_error_field_name,
379
+ } => {
380
+ let mut result = BTreeMap :: new ( ) ;
381
+ result. insert ( raw_line_field_name. clone ( ) , value. into ( ) ) ;
382
+ if let Some ( err_field) = parse_error_field_name {
383
+ result. insert ( err_field. clone ( ) , format ! ( "{e:?}" ) . into ( ) ) ;
384
+ }
385
+ result
386
+ }
387
+ } ,
388
+ } ;
367
389
let mut result = Self {
368
- data : serde_json :: from_str ( value ) ? ,
390
+ data,
369
391
cached_display_list : None ,
370
392
} ;
371
393
if let Some ( key) = data_display_options. row_idx_field_name . as_ref ( ) {
0 commit comments