@@ -2,8 +2,8 @@ use std::collections::{BTreeMap, btree_map::Entry};
22
33use anyhow:: Context ;
44use chrono:: { NaiveDate , Utc } ;
5+ use google_sheets4:: api:: CellData ;
56use serde:: Serialize ;
6- use sheets:: types:: GridData ;
77use tracing:: warn;
88
99use crate :: {
@@ -44,55 +44,49 @@ pub async fn get_mentoring_records(
4444 records : BTreeMap :: new ( ) ,
4545 } ;
4646
47- for sheet_data in sheet_data {
48- if sheet_data. start_column != 0 || sheet_data. start_row != 0 {
49- return Err ( Error :: Fatal ( anyhow:: anyhow!(
50- "Start column and row were {} and {}, expected 0 and 0" ,
51- sheet_data. start_column,
52- sheet_data. start_row
53- ) ) ) ;
47+ for ( row_number, cells) in sheet_data. into_iter ( ) . enumerate ( ) {
48+ if cells. is_empty ( ) {
49+ continue ;
5450 }
55-
56- for ( row_number, row) in sheet_data. row_data . into_iter ( ) . enumerate ( ) {
57- let cells = row. values ;
58- if cells. is_empty ( ) {
59- continue ;
51+ if cells. len ( ) < 6 && !cell_string ( & cells[ 0 ] ) . is_empty ( ) {
52+ warn ! (
53+ "Parsing mentoring data from Google Sheet with ID {}: Not enough columns for row {} - expected at least 6, got {} containing: {}" ,
54+ mentoring_records_sheet_id,
55+ row_number,
56+ cells. len( ) ,
57+ format!( "{:#?}" , cells) ,
58+ ) ;
59+ continue ;
60+ }
61+ if row_number == 0 {
62+ let headings = cells. iter ( ) . take ( 6 ) . map ( cell_string) . collect :: < Vec < _ > > ( ) ;
63+ if headings != [ "Name" , "Region" , "Date" , "Staff" , "Status" , "Notes" ] {
64+ return Err ( Error :: Fatal ( anyhow:: anyhow!(
65+ "Mentoring data sheet contained wrong headings: {}" ,
66+ headings. join( ", " )
67+ ) ) ) ;
6068 }
61- if cells. len ( ) < 6 && !cell_string ( & cells[ 0 ] ) . is_empty ( ) {
62- warn ! (
63- "Parsing mentoring data from Google Sheet with ID {}: Not enough columns for row {} - expected at least 6, got {} containing: {}" ,
64- mentoring_records_sheet_id,
65- row_number,
66- cells. len( ) ,
67- format!( "{:#?}" , cells) ,
68- ) ;
69- continue ;
69+ } else {
70+ if cells[ 0 ] . effective_value . is_none ( ) {
71+ break ;
7072 }
71- if row_number == 0 {
72- let headings = cells. iter ( ) . take ( 6 ) . map ( cell_string) . collect :: < Vec < _ > > ( ) ;
73- if headings != [ "Name" , "Region" , "Date" , "Staff" , "Status" , "Notes" ] {
74- return Err ( Error :: Fatal ( anyhow:: anyhow!(
75- "Mentoring data sheet contained wrong headings: {}" ,
76- headings. join( ", " )
77- ) ) ) ;
78- }
79- } else {
80- if cells[ 0 ] . effective_value . is_none ( ) {
81- break ;
73+ let name = cell_string ( & cells[ 0 ] ) ;
74+ let date = cell_date ( & cells[ 2 ] ) . with_context ( || {
75+ format ! (
76+ "Failed to parse date from row {} in sheet ID {}" ,
77+ row_number + 1 ,
78+ mentoring_records_sheet_id
79+ )
80+ } ) ?;
81+ let entry = mentoring_records. records . entry ( name) ;
82+ match entry {
83+ Entry :: Vacant ( entry) => {
84+ entry. insert ( MentoringRecord { last_date : date } ) ;
8285 }
83- let name = cell_string ( & cells[ 0 ] ) ;
84- let date = cell_date ( & cells[ 2 ] )
85- . with_context ( || format ! ( "Failed to parse date from row {}" , row_number + 1 ) ) ?;
86- let entry = mentoring_records. records . entry ( name) ;
87- match entry {
88- Entry :: Vacant ( entry) => {
86+ Entry :: Occupied ( mut entry) => {
87+ if entry. get ( ) . last_date < date {
8988 entry. insert ( MentoringRecord { last_date : date } ) ;
9089 }
91- Entry :: Occupied ( mut entry) => {
92- if entry. get ( ) . last_date < date {
93- entry. insert ( MentoringRecord { last_date : date } ) ;
94- }
95- }
9690 }
9791 }
9892 }
@@ -103,9 +97,10 @@ pub async fn get_mentoring_records(
10397async fn get_mentoring_records_grid_data (
10498 client : SheetsClient ,
10599 mentoring_records_sheet_id : & str ,
106- ) -> Result < Vec < GridData > , Error > {
107- let data_result = client. get ( mentoring_records_sheet_id, true , & [ ] ) . await ;
108- let data = match data_result {
100+ ) -> Result < Vec < Vec < CellData > > , Error > {
101+ let expected_sheet_title = "Feedback" ;
102+ let data_result = client. get ( mentoring_records_sheet_id) . await ;
103+ let mut data = match data_result {
109104 Ok ( data) => data,
110105 Err ( Error :: PotentiallyIgnorablePermissions ( _) ) => {
111106 return Ok ( Vec :: new ( ) ) ;
@@ -120,24 +115,12 @@ async fn get_mentoring_records_grid_data(
120115 return Err ( err) ;
121116 }
122117 } ;
123- let expected_sheet_title = "Feedback" ;
124- let sheet = data
125- . body
126- . sheets
127- . into_iter ( )
128- . find ( |sheet| {
129- sheet
130- . properties
131- . as_ref ( )
132- . map ( |properties| properties. title . as_str ( ) )
133- == Some ( expected_sheet_title)
134- } )
135- . ok_or_else ( || {
136- Error :: Fatal ( anyhow:: anyhow!(
137- "Couldn't find sheet '{}' in spreadsheet with ID {}" ,
138- expected_sheet_title,
139- mentoring_records_sheet_id
140- ) )
141- } ) ?;
142- Ok ( sheet. data )
118+ let sheet = data. remove ( expected_sheet_title) . ok_or_else ( || {
119+ Error :: Fatal ( anyhow:: anyhow!(
120+ "Couldn't find sheet '{}' in spreadsheet with ID {}" ,
121+ expected_sheet_title,
122+ mentoring_records_sheet_id
123+ ) )
124+ } ) ?;
125+ Ok ( sheet. rows )
143126}
0 commit comments