77mod  private
88{ 
99  use  regex:: Regex ; 
10+ use  serde_json:: json; 
1011  use  std:: collections:: HashMap ; 
1112
1213  use  crate :: * ; 
@@ -23,6 +24,56 @@ mod private
2324    BatchUpdateValuesRequest ,  
2425    BatchUpdateValuesResponse ,  
2526  } ; 
27+ 
28+   /// # check_variant 
29+    ///  
30+    /// Checks if passed variant is correct. 
31+    ///  
32+    /// ## Returns: 
33+    ///  - `Result< () >` 
34+    ///  
35+    /// ## Errors: 
36+    ///  
37+    /// Can occur if passed varaint is not alllowed. 
38+    pub  fn  check_variant 
39+   (  
40+     variant :  & str , 
41+     allowed  :  Vec <  & str  >  
42+   )  -> Result <  ( )  > 
43+   { 
44+     if  allowed. contains (  & variant ) 
45+     { 
46+       Ok (  ( )  ) 
47+     } 
48+     else 
49+     { 
50+       Err 
51+       (  
52+         Error :: ParseError (  format ! (  "Not suchvariant: {}. Allowed: {:?}" ,  variant,  allowed )  ) 
53+       ) 
54+     } 
55+   } 
56+ 
57+   /// # parse_json 
58+    ///  
59+    /// Parse passed json to HashMap< String, serde_json::Value > 
60+    ///  
61+    /// ## Returns 
62+    ///  - `Result< HashMap< String, serde_json::Value > >` 
63+    ///  
64+    /// ## Errors 
65+    ///  
66+    /// Can occur if the passed json is not valid. 
67+    pub  fn  parse_json 
68+   (  
69+     json_str  :  & str  
70+   )  -> Result <  HashMap <  String ,  serde_json:: Value  >  > 
71+   { 
72+     let  parsed_json:  HashMap <  String ,  serde_json:: Value  >  = serde_json:: from_str (  json_str ) 
73+     . map_err (  | error | Error :: InvalidJSON (  format ! (  "Failed to parse JSON: {}" ,  error )  )  ) ?; 
74+ 
75+     Ok (  parsed_json ) 
76+   } 
2677
2778  /// # `get_spreadsheet_id_from_url` 
2879   /// 
@@ -86,7 +137,7 @@ mod private
86137   ///   Occurs if the Google Sheets API returns an error, e.g., due to invalid input or insufficient permissions. 
87138   pub  async  fn  update_row 
88139  ( 
89-     client  :  & Client , 
140+     client  :  & Client < ' _ > , 
90141    spreadsheet_id  :  & str , 
91142    sheet_name  :  & str , 
92143    row_key  :  serde_json:: Value , 
@@ -129,7 +180,7 @@ mod private
129180  } 
130181
131182
132-   /// # `update_row_by_custom_row_key ` 
183+   /// # `update_rows_by_custom_row_key ` 
133184   /// 
134185   /// Updates a specific row or rows in a Google Sheet with the provided values. 
135186   /// 
@@ -159,7 +210,7 @@ mod private
159210   ///   Occurs if the Google Sheets API returns an error, e.g., due to invalid input or insufficient permissions. 
160211   pub  async  fn  update_rows_by_custom_row_key 
161212  ( 
162-     client  :  & Client , 
213+     client  :  & Client < ' _ > , 
163214    spreadsheet_id  :  & str , 
164215    sheet_name  :  & str , 
165216    key_by  :  (  & str ,  serde_json:: Value  ) ,  
@@ -180,16 +231,34 @@ mod private
180231    . await 
181232    . map_err (  | err | Error :: ApiError (  err. to_string ( )  )  ) ?; 
182233
183-     let  values = value_range
184-     . values 
185-     . ok_or_else (  || Error :: ApiError (  "No value found" . to_owned ( )  )  ) ?; 
186- 
187-     let  column = values
188-     . get (  0  ) 
189-     . ok_or_else (  || Error :: ApiError (  "No first row found" . to_owned ( )  )  ) ?; 
234+     let  values = match  value_range. values 
235+     { 
236+       Some (  values )  => values, 
237+       None  =>
238+       { 
239+         match  on_fail
240+         { 
241+           OnFail :: Nothing  => return  Ok (  BatchUpdateValuesResponse :: default ( )  ) , 
242+           OnFail :: AppendRow  =>
243+           { 
244+             let  _ = append_row (  client,  spreadsheet_id,  sheet_name,  & row_key_val ) . await ?; 
245+             let  response = BatchUpdateValuesResponse 
246+             { 
247+               spreadsheet_id  :  Some (  spreadsheet_id. to_string ( )  ) , 
248+               total_updated_rows  :  Some (  1  ) , 
249+               total_updated_sheets  :  Some (  1  ) , 
250+               ..Default :: default ( ) 
251+             } ; 
252+ 
253+             return  Ok (  response ) ; 
254+           } 
255+           OnFail :: Error  => return  Err (  Error :: ApiError (  "Not such value in the sheet." . to_string ( )  )  ) 
256+         } 
257+       } 
258+     } ; 
190259
191260    // Counting mathces. 
192-     let  row_keys:  Vec < usize >  = column 
261+     let  row_keys:  Vec <   usize   >  = values [ 0 ] 
193262    . iter ( ) 
194263    . enumerate ( ) 
195264    . filter (  | & (  _,  val )  | {  * val == key_by. 1  }  ) 
@@ -244,6 +313,7 @@ mod private
244313      } 
245314    } 
246315
316+     println ! ( "value ranges : {:?}" ,  value_ranges) ; 
247317    // Making HTTP request. 
248318    let  request = BatchUpdateValuesRequest 
249319    { 
@@ -271,7 +341,8 @@ mod private
271341  /// # `append_row` 
272342   /// 
273343   /// Append a new row at the end of the sheet. 
274-    /// If there is place to put all values to exestits row ( cells are empty ), it will put there instead of append a new row. 
344+    /// If there is an empty space in provided range, it will put values begining from A index. 
345+    /// More information you can find here [append docs](https://developers.google.com/sheets/api/reference/rest/v4/spreadsheets.values/append) 
275346   /// 
276347   /// ## Parameters: 
277348   /// - `client`:   
@@ -294,7 +365,7 @@ mod private
294365   ///   or insufficient permissions. 
295366   pub  async  fn  append_row 
296367  ( 
297-     client  :  & Client , 
368+     client  :  & Client < ' _ > , 
298369    spreadsheet_id  :  & str , 
299370    sheet_name  :  & str , 
300371    row_key_val  :  & HashMap <  String ,  serde_json:: Value  > 
@@ -322,8 +393,7 @@ mod private
322393    } 
323394
324395    // Creating request. 
325-     let  range = format ! (  "{}!{}:{}" ,  sheet_name,  columns. first( ) . unwrap( ) ,  columns. last( ) . unwrap( )  ) ; 
326- 
396+     let  range = format ! (  "{}!A1" ,  sheet_name ) ; 
327397    let  value_range = ValueRange 
328398    { 
329399      major_dimension  :  Some (  Dimension :: Row  ) , 
@@ -393,10 +463,10 @@ mod private
393463   pub  async  fn  get_header 
394464  ( 
395465
396-     client  :  & Client , 
466+     client  :  & Client < ' _ > , 
397467    spreadsheet_id  :  & str , 
398468    sheet_name  :  & str ,  
399-   )  -> Result <  Vec <  Vec <   serde_json:: Value   >  >  > 
469+   )  -> Result <  Vec <  serde_json:: Value  >  > 
400470  { 
401471    let  range = format ! (  "{}!A1:ZZZ1" ,  sheet_name ) ; 
402472
@@ -406,7 +476,14 @@ mod private
406476    . doit ( ) 
407477    . await 
408478    { 
409-       Ok (  response )  => Ok (  response. values . unwrap ( )  ) , 
479+       Ok (  response )  =>
480+       { 
481+         match  response. values 
482+         { 
483+           Some (  values )  => Ok (  values[ 0 ] . clone ( )  ) , 
484+           None  => Ok (  Vec :: new ( )  ) 
485+         } 
486+       }  
410487      Err (  error )  => Err (  error ) 
411488    } 
412489
@@ -433,7 +510,7 @@ mod private
433510   ///   or insufficient permissions. 
434511   pub  async  fn  get_rows 
435512  ( 
436-     client  :  & Client , 
513+     client  :  & Client < ' _ > , 
437514    spreadsheet_id  :  & str , 
438515    sheet_name  :  & str ,  
439516  )  -> Result <  Vec <  Vec <  serde_json:: Value  >  >  > 
@@ -443,10 +520,18 @@ mod private
443520    match  client
444521    . spreadsheet ( ) 
445522    . values_get (  spreadsheet_id,  & range ) 
523+     . value_render_option (  ValueRenderOption :: UnformattedValue  ) 
446524    . doit ( ) 
447525    . await 
448526    { 
449-       Ok (  response )  => Ok (  response. values . unwrap ( )  ) , 
527+       Ok (  response )  => 
528+       { 
529+         match  response. values 
530+         { 
531+           Some (  values )  => Ok (  values ) , 
532+           None  => Ok (  Vec :: new ( )  ) 
533+         } 
534+       } 
450535      Err (  error )  => Err (  error ) 
451536    } 
452537
@@ -475,7 +560,7 @@ mod private
475560   ///   or insufficient permissions. 
476561   pub  async  fn  get_cell 
477562  ( 
478-     client  :  & Client , 
563+     client  :  & Client < ' _ > , 
479564    spreadsheet_id  :  & str , 
480565    sheet_name  :  & str , 
481566    cell_id  :  & str 
@@ -489,17 +574,14 @@ mod private
489574    . doit ( ) 
490575    . await 
491576    { 
492-       Ok (  response )  => Ok 
493-       (  
494-         response
495-         . values 
496-         . unwrap ( ) 
497-         . get (  0  ) 
498-         . unwrap ( ) 
499-         . get (  0  ) 
500-         . unwrap ( ) 
501-         . clone ( )  
502-       ) , 
577+       Ok (  response )  =>
578+       { 
579+         match  response. values 
580+         { 
581+           Some (  values )  => Ok (  values[ 0 ] [ 0 ] . clone ( )  ) , 
582+           None  => Ok (  json ! (  ""  )  ) 
583+         } 
584+       } 
503585      Err (  error )  => Err (  error ) 
504586    } 
505587  } 
@@ -528,7 +610,7 @@ mod private
528610   ///   Occurs if the Google Sheets API returns an error, such as invalid input or insufficient permissions. 
529611   pub  async  fn  set_cell 
530612  ( 
531-     client  :  & Client , 
613+     client  :  & Client < ' _ > , 
532614    spreadsheet_id  :  & str , 
533615    sheet_name  :  & str , 
534616    cell_id  :  & str , 
@@ -588,5 +670,7 @@ crate::mod_interface!
588670    append_row, 
589671    update_rows_by_custom_row_key, 
590672    get_spreadsheet_id_from_url, 
673+     parse_json, 
674+     check_variant
591675  } ; 
592676} 
0 commit comments