use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct CreateSpreadsheetParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub folder_token: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateSpreadsheetResponse {
pub spreadsheet: CreatedSpreadsheet,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreatedSpreadsheet {
pub title: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub folder_token: Option<String>,
pub url: String,
pub spreadsheet_token: String,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct UpdateSpreadsheetParams {
#[serde(skip_serializing_if = "Option::is_none")]
pub title: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct UpdateSpreadsheetResponse {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetSpreadsheetResponse {
pub spreadsheet: SpreadsheetInfo,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpreadsheetInfo {
pub title: String,
pub owner_id: String,
pub token: String,
pub url: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct QuerySheetResponse {
pub sheets: Vec<Sheet>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetSheetResponse {
pub sheet: Sheet,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Sheet {
pub sheet_id: String,
pub title: String,
pub index: i32,
pub hidden: bool,
pub grid_properties: GridProperties,
pub resource_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub merges: Option<Vec<MergeRange>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridProperties {
pub frozen_row_count: i32,
pub frozen_column_count: i32,
pub row_count: i32,
pub column_count: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MergeRange {
pub start_row_index: i32,
pub end_row_index: i32,
pub start_column_index: i32,
pub end_column_index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MoveDimensionParams {
pub source: DimensionSource,
pub destination_index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct DimensionSource {
pub major_dimension: String,
pub start_index: i32,
pub end_index: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct MoveDimensionResponse {}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindCondition {
pub range: String,
pub match_case: bool,
pub match_entire_cell: bool,
pub search_by_regex: bool,
pub include_formulas: bool,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindParams {
pub find_condition: FindCondition,
pub find: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindResponse {
pub find_result: FindResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindReplaceParams {
pub find_condition: FindCondition,
pub find: String,
pub replacement: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindReplaceResponse {
pub replace_result: FindResult,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindResult {
pub matched_cells: Vec<String>,
pub matched_formula_cells: Vec<String>,
pub rows_count: i32,
}
#[cfg(test)]
mod tests {
use serde_json;
#[test]
fn test_serialization_roundtrip() {
let json = r#"{"test": "value"}"#;
assert!(serde_json::from_str::<serde_json::Value>(json).is_ok());
}
#[test]
fn test_deserialization_from_json() {
let json = r#"{"field": "data"}"#;
let value: serde_json::Value = serde_json::from_str(json).unwrap();
assert_eq!(value["field"], "data");
}
}