Skip to content

Commit 0a7603e

Browse files
authored
Merge branch 'fix-gspread2' into config_variation
2 parents 7b83792 + 068ac8a commit 0a7603e

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

46 files changed

+3048
-717
lines changed

module/move/gspread/src/actions.rs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,5 +12,7 @@ crate::mod_interface!
1212
layer gspread_cell_get;
1313
layer gspread_cell_set;
1414
layer gspread_cells_set;
15+
layer gspread_row_append;
16+
layer gspread_row_update_custom;
1517
}
1618

module/move/gspread/src/actions/gspread.rs

Lines changed: 117 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
mod 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
}

module/move/gspread/src/actions/gspread_cell_get.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ mod private
1313

1414
pub async fn action
1515
(
16-
client : &Client,
16+
client : &Client<'_>,
1717
spreadsheet_id : &str,
1818
sheet_name : &str,
1919
cell_id : &str,

module/move/gspread/src/actions/gspread_cell_set.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ mod private
1919

2020
pub async fn action
2121
(
22-
client : &Client,
22+
client : &Client<'_>,
2323
spreadsheet_id : &str,
2424
sheet_name : &str,
2525
cell_id : &str,

module/move/gspread/src/actions/gspread_cells_set.rs

Lines changed: 16 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ mod private
2525
struct ParsedJson
2626
{
2727
row_key : serde_json::Value,
28-
row_key_val : HashMap< String, serde_json::Value >
28+
row_key_val : HashMap< String, serde_json::Value >,
2929
}
3030

3131
/// # `parse_json`
@@ -55,13 +55,7 @@ mod private
5555
}
5656
else
5757
{
58-
return Err
59-
(
60-
Error::InvalidJSON
61-
(
62-
format!( "Key '{}' not found in JSON", select_row_by_key )
63-
)
64-
);
58+
return Err( Error::InvalidJSON( format!( "Key '{}' not found in JSON", select_row_by_key ) ) );
6559
};
6660

6761
for ( col_name, _ ) in &parsed_json
@@ -83,7 +77,7 @@ mod private
8377
ParsedJson
8478
{
8579
row_key : row_key,
86-
row_key_val : parsed_json
80+
row_key_val : parsed_json,
8781
}
8882
)
8983
}
@@ -103,7 +97,7 @@ mod private
10397
key : &str
10498
) -> Result< () >
10599
{
106-
let keys = vec![ "id" ];
100+
let keys = vec![ "id", "custom" ];
107101
if keys.contains( &key )
108102
{
109103
Ok( () )
@@ -119,7 +113,7 @@ mod private
119113

120114
pub async fn action
121115
(
122-
client : &Client,
116+
client : &Client<'_>,
123117
select_row_by_key : &str,
124118
json_str : &str,
125119
spreadsheet_id : &str,
@@ -130,18 +124,20 @@ mod private
130124

131125
match parse_json( json_str, select_row_by_key )
132126
{
133-
Ok( parsed_json ) =>
134-
match update_row( client, spreadsheet_id, table_name, parsed_json.row_key, parsed_json.row_key_val ).await
127+
Ok( parsed_json ) =>
135128
{
136-
Ok( response ) =>
129+
match update_row( client, spreadsheet_id, table_name, parsed_json.row_key, parsed_json.row_key_val ).await
137130
{
138-
match response.total_updated_cells
131+
Ok( response ) =>
139132
{
140-
Some( val ) => Ok( val ),
141-
None => Ok( 0 ),
142-
}
143-
},
144-
Err( error ) => Err( error )
133+
match response.total_updated_cells
134+
{
135+
Some( val ) => Ok( val ),
136+
None => Ok( 0 ),
137+
}
138+
},
139+
Err( error ) => Err( error )
140+
}
145141
}
146142
Err( error ) => Err( error ),
147143
}

0 commit comments

Comments
 (0)