use serde::{Deserialize, Serialize};
use serde_json::Value;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadSingleRangeParams {
#[serde(rename = "value_range")]
pub value_range: String,
#[serde(rename = "value_render_option")]
pub value_render_option: Option<String>,
#[serde(rename = "date_render_option")]
pub date_render_option: Option<String>,
}
#[derive(Debug, Clone, Serialize, Default)]
pub struct ReadSingleRangeResponse {
pub data: Option<RangeData>,
}
impl<'de> Deserialize<'de> for ReadSingleRangeResponse {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::Deserializer<'de>,
{
let raw = Value::deserialize(deserializer)?;
if let Some(inner) = raw.get("data") {
let data: RangeData =
serde_json::from_value(inner.clone()).map_err(serde::de::Error::custom)?;
return Ok(Self { data: Some(data) });
}
let spreadsheet_token = raw
.get("spreadsheet_token")
.or_else(|| raw.get("spreadsheetToken"))
.and_then(Value::as_str)
.unwrap_or_default()
.to_string();
if let Some(value_range_obj) = raw.get("valueRange").or_else(|| raw.get("value_range")) {
let value_range = value_range_obj
.get("range")
.and_then(Value::as_str)
.unwrap_or_default()
.to_string();
let major_dimension = value_range_obj
.get("majorDimension")
.or_else(|| value_range_obj.get("major_dimension"))
.and_then(Value::as_str)
.unwrap_or("ROWS")
.to_string();
let values = value_range_obj
.get("values")
.and_then(Value::as_array)
.map(|rows| {
rows.iter()
.map(|row| row.as_array().cloned().unwrap_or_default())
.collect::<Vec<Vec<Value>>>()
})
.unwrap_or_default();
return Ok(Self {
data: Some(RangeData {
spreadsheet_token,
value_range,
major_dimension,
values,
}),
});
}
Ok(Self { data: None })
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RangeData {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "value_range")]
pub value_range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: String,
pub values: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadMultipleRangesParams {
pub ranges: Vec<String>,
#[serde(rename = "value_render_option")]
pub value_render_option: Option<String>,
#[serde(rename = "date_render_option")]
pub date_render_option: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ReadMultipleRangesResponse {
pub data: Option<MultipleRangeData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct MultipleRangeData {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "value_ranges")]
pub value_ranges: Vec<RangeData>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WriteSingleRangeParams {
#[serde(rename = "range")]
pub range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: Option<String>,
pub values: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WriteSingleRangeResponse {
pub data: Option<UpdateRangeResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UpdateRangeResult {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "updated_range")]
pub updated_range: String,
#[serde(rename = "updated_rows")]
pub updated_rows: i32,
#[serde(rename = "updated_columns")]
pub updated_columns: i32,
#[serde(rename = "updated_cells")]
pub updated_cells: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchWriteRangesParams {
pub data: Vec<BatchWriteData>,
#[serde(rename = "include_style")]
pub include_style: Option<bool>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchWriteData {
#[serde(rename = "data_range")]
pub data_range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: String,
pub values: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchWriteRangesResponse {
pub data: Option<BatchUpdateResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct BatchUpdateResult {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "updated_ranges")]
pub updated_ranges: Vec<UpdateRangeResult>,
#[serde(rename = "total_updated_rows")]
pub total_updated_rows: i32,
#[serde(rename = "total_updated_columns")]
pub total_updated_columns: i32,
#[serde(rename = "total_updated_cells")]
pub total_updated_cells: i32,
#[serde(rename = "total_updated_styles")]
pub total_updated_styles: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppendValuesParams {
#[serde(rename = "range")]
pub range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: Option<String>,
pub values: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppendValuesResponse {
pub data: Option<AppendResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct AppendResult {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "updated_range")]
pub updated_range: String,
#[serde(rename = "updated_rows")]
pub updated_rows: i32,
#[serde(rename = "updated_columns")]
pub updated_columns: i32,
#[serde(rename = "updated_cells")]
pub updated_cells: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InsertValuesParams {
#[serde(rename = "range")]
pub range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: Option<String>,
pub values: Vec<Vec<serde_json::Value>>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InsertValuesResponse {
pub data: Option<InsertResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct InsertResult {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "updated_range")]
pub updated_range: String,
#[serde(rename = "updated_rows")]
pub updated_rows: i32,
#[serde(rename = "updated_columns")]
pub updated_columns: i32,
#[serde(rename = "updated_cells")]
pub updated_cells: i32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValuesImageParams {
#[serde(rename = "range")]
pub range: String,
#[serde(rename = "major_dimension")]
pub major_dimension: Option<String>,
pub values: Vec<ImageValue>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageValue {
#[serde(rename = "image_key")]
pub image_key: String,
#[serde(rename = "alternative_text")]
pub alternative_text: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ValuesImageResponse {
pub data: Option<ImageResult>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ImageResult {
#[serde(rename = "spreadsheet_token")]
pub spreadsheet_token: String,
#[serde(rename = "updated_range")]
pub updated_range: String,
#[serde(rename = "updated_rows")]
pub updated_rows: i32,
#[serde(rename = "updated_columns")]
pub updated_columns: i32,
#[serde(rename = "updated_cells")]
pub updated_cells: 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");
}
}