use serde::{Deserialize, Serialize};
use serde_json::Value;
use std::collections::HashMap;
pub type SpreadsheetToken = String;
pub type SheetId = String;
pub type FilterViewId = String;
pub type FloatImageId = String;
pub type FloatImageToken = String;
pub type Range = String;
pub type CellReference = String;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SheetProperty {
pub title: String,
pub index: i32,
pub sheet_id: Option<String>,
pub sheet_color: Option<String>,
pub hidden: Option<bool>,
pub grid_properties: Option<GridProperties>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GridProperties {
pub frozen_row_count: Option<i32>,
pub frozen_column_count: Option<i32>,
pub hide_gridlines: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SheetInfo {
pub sheet_id: String,
pub title: String,
pub index: i32,
pub sheet_color: Option<String>,
pub hidden: Option<bool>,
pub grid_properties: Option<GridProperties>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpreadsheetInfo {
pub spreadsheet_token: String,
pub title: String,
pub create_time: String,
pub update_time: Option<String>,
pub time_zone: Option<String>,
pub locale: Option<String>,
pub sheets: Option<Vec<SheetInfo>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeZone {
pub time_zone: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Locale {
pub locale: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateSpreadsheetRequest {
pub title: String,
pub sheets: Option<Vec<SheetProperty>>,
pub time_zone: Option<TimeZone>,
pub locale: Option<Locale>,
pub folder_path: Option<String>,
pub properties: Option<HashMap<String, Value>>,
}
impl Default for CreateSpreadsheetRequest {
fn default() -> Self {
Self {
title: "未命名电子表格".to_string(),
sheets: None,
time_zone: None,
locale: None,
folder_path: None,
properties: None,
}
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateSpreadsheetRequest {
pub title: Option<String>,
pub time_zone: Option<TimeZone>,
pub locale: Option<Locale>,
pub properties: Option<HashMap<String, Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilterCondition {
pub column_id: String,
pub operator: String,
pub value: Option<serde_json::Value>,
pub ignore_case: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFilterRequest {
pub range: Range,
pub conditions: Option<Vec<FilterCondition>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateFilterRequest {
pub conditions: Option<Vec<FilterCondition>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilterInfo {
pub filter_id: String,
pub range: Range,
pub conditions: Option<Vec<FilterCondition>>,
pub create_time: Option<String>,
pub update_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilterViewInfo {
pub filter_view_id: String,
pub name: String,
pub range: Range,
pub create_time: Option<String>,
pub update_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFilterViewRequest {
pub filter_view_id: Option<String>,
pub name: Option<String>,
pub range: Range,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateFilterViewRequest {
pub name: Option<String>,
pub range: Option<Range>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FilterViewCondition {
pub filter_view_id: String,
pub column_id: String,
pub operator: String,
pub value: Option<serde_json::Value>,
pub ignore_case: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateFloatImageRequest {
pub float_image_token: FloatImageToken,
pub range: Range,
pub float_image_id: Option<String>,
pub width: Option<i32>,
pub height: Option<i32>,
pub offset_x: Option<i32>,
pub offset_y: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateFloatImageRequest {
pub range: Option<Range>,
pub width: Option<i32>,
pub height: Option<i32>,
pub offset_x: Option<i32>,
pub offset_y: Option<i32>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FloatImageInfo {
pub float_image_id: String,
pub float_image_token: FloatImageToken,
pub range: Range,
pub width: i32,
pub height: i32,
pub offset_x: i32,
pub offset_y: i32,
pub create_time: Option<String>,
pub update_time: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindCellsRequest {
pub range: Range,
pub find: String,
pub match_case: Option<bool>,
pub match_entire_cell: Option<bool>,
pub use_regular_expressions: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct FindResult {
pub cell_position: Vec<CellPosition>,
pub total_count: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CellPosition {
pub sheet_id: String,
pub row_index: i32,
pub column_index: i32,
pub value: Option<serde_json::Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplaceCellsRequest {
pub range: Range,
pub find: String,
pub replacement: String,
pub match_case: Option<bool>,
pub match_entire_cell: Option<bool>,
pub use_regular_expressions: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReplaceResult {
pub replaced_cells: Vec<CellPosition>,
pub replaced_count: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MoveDimensionRequest {
pub source_range: Range,
pub destination_index: i32,
pub dimension: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SheetsResponse<T> {
pub data: Option<T>,
pub error: Option<serde_json::Value>,
pub request_id: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct PagedResponse<T> {
pub items: Option<Vec<T>>,
pub has_more: Option<bool>,
pub page_token: Option<String>,
pub total: Option<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");
}
}