@@ -10,7 +10,7 @@ use crate::haystack::val::{
1010
1111use crate :: haystack:: timezone:: make_date_time_with_tz;
1212use crate :: units:: get_unit;
13- use crate :: val:: GRID_FORMAT_VERSION ;
13+ use crate :: val:: { GRID_FORMAT_VERSION , VER } ;
1414
1515use chrono:: { Offset , Utc } ;
1616use serde:: de:: { Deserialize , Deserializer , Error , MapAccess , SeqAccess , Visitor } ;
@@ -470,53 +470,12 @@ fn parse_grid(dict: &Dict) -> Result<HVal, JsonErr> {
470470 match dict. get_list ( "rows" ) {
471471 Some ( rows) => match dict. get_list ( "cols" ) {
472472 Some ( cols) => {
473- let mut grid_ver = GRID_FORMAT_VERSION . to_string ( ) ;
474-
473+ let ( meta, ver) = parse_grid_meta_and_ver ( dict) ;
475474 let grid = Grid {
476- meta : dict. get_dict ( "meta" ) . cloned ( ) . map ( |mut meta| {
477- if let Some ( ver) = meta. get_str ( "ver" ) {
478- grid_ver = ver. value . to_owned ( ) ;
479- } ;
480- meta. remove ( "ver" ) ;
481- meta
482- } ) ,
483- columns : {
484- let cols: Result < Vec < Column > , JsonErr > = cols
485- . iter ( )
486- . map ( |col| match col {
487- HVal :: Dict ( dict) => match dict. get_str ( "name" ) {
488- Some ( name) => match dict. get ( "meta" ) {
489- Some ( meta) => match meta {
490- HVal :: Dict ( meta) => Ok ( Column {
491- name : name. value . clone ( ) ,
492- meta : Some ( meta. clone ( ) ) ,
493- } ) ,
494- _ => Err ( JsonErr :: custom ( "Invalid 'meta'" ) ) ,
495- } ,
496- None => Ok ( Column {
497- name : name. value . clone ( ) ,
498- meta : None ,
499- } ) ,
500- } ,
501- None => Err ( JsonErr :: custom ( "Missing or invalid 'name'" ) ) ,
502- } ,
503- _ => Err ( JsonErr :: custom ( "Invalid column type, expected a Dict" ) ) ,
504- } )
505- . collect ( ) ;
506- cols?
507- } ,
508-
509- rows : {
510- let rows: Result < Vec < Dict > , JsonErr > = rows
511- . iter ( )
512- . map ( |row| match row {
513- HVal :: Dict ( row) => Ok ( row. clone ( ) ) ,
514- _ => Err ( JsonErr :: custom ( "Invalid row type, expected a Dict" ) ) ,
515- } )
516- . collect ( ) ;
517- rows?
518- } ,
519- ver : grid_ver,
475+ meta,
476+ columns : parse_grid_columns ( cols) ?,
477+ rows : parse_grid_rows ( rows) ?,
478+ ver,
520479 } ;
521480 Ok ( grid. into ( ) )
522481 }
@@ -525,3 +484,53 @@ fn parse_grid(dict: &Dict) -> Result<HVal, JsonErr> {
525484 None => Err ( JsonErr :: custom ( "Missing or invalid 'rows'" ) ) ,
526485 }
527486}
487+
488+ fn parse_grid_meta_and_ver ( dict : & Dict ) -> ( Option < Dict > , String ) {
489+ let mut meta = dict. get_dict ( "meta" ) . cloned ( ) ;
490+ let mut grid_ver = GRID_FORMAT_VERSION . to_string ( ) ;
491+
492+ if let Some ( ref mut meta_dict) = meta {
493+ if let Some ( ver) = meta_dict. get_str ( VER ) {
494+ grid_ver = ver. value . to_owned ( ) ;
495+ meta_dict. remove ( VER ) ;
496+ }
497+
498+ // If the meta dict is empty then use none.
499+ if meta_dict. is_empty ( ) {
500+ meta = None ;
501+ }
502+ }
503+
504+ ( meta, grid_ver)
505+ }
506+
507+ fn parse_grid_columns ( cols : & List ) -> Result < Vec < Column > , JsonErr > {
508+ cols. iter ( )
509+ . map ( |col| match col {
510+ HVal :: Dict ( dict) => match dict. get_str ( "name" ) {
511+ Some ( name) => match dict. get ( "meta" ) {
512+ Some ( HVal :: Dict ( meta) ) => Ok ( Column {
513+ name : name. value . clone ( ) ,
514+ meta : Some ( meta. clone ( ) ) ,
515+ } ) ,
516+ Some ( _) => Err ( JsonErr :: custom ( "Invalid 'meta'" ) ) ,
517+ None => Ok ( Column {
518+ name : name. value . clone ( ) ,
519+ meta : None ,
520+ } ) ,
521+ } ,
522+ None => Err ( JsonErr :: custom ( "Missing or invalid 'name'" ) ) ,
523+ } ,
524+ _ => Err ( JsonErr :: custom ( "Invalid column type, expected a Dict" ) ) ,
525+ } )
526+ . collect ( )
527+ }
528+
529+ fn parse_grid_rows ( rows : & List ) -> Result < Vec < Dict > , JsonErr > {
530+ rows. iter ( )
531+ . map ( |row| match row {
532+ HVal :: Dict ( row) => Ok ( row. clone ( ) ) ,
533+ _ => Err ( JsonErr :: custom ( "Invalid row type, expected a Dict" ) ) ,
534+ } )
535+ . collect ( )
536+ }
0 commit comments