use serde::{Deserialize, Serialize};
use crate::{
core::{
api_req::ApiRequest,
api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
constants::AccessTokenType,
req_option, SDKResult,
},
impl_executable_builder_owned,
service::sheets::v2::{spreadsheet_sheet::UpdateSheetProperty, SpreadsheetSheetService},
};
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct OperateSheetsRequest {
#[serde(skip)]
api_request: ApiRequest,
#[serde(skip)]
spreadsheet_token: String,
requests: Vec<OperateSheetsRequestElem>,
}
#[derive(Serialize, Deserialize, Debug)]
pub enum OperateSheetsRequestElem {
#[serde(rename = "addSheet")]
AddSheet {
properties: AddSheetProperty,
},
#[serde(rename = "copySheet")]
CopySheet {
source: CopySheetSource,
destination: CopySheetDestination,
},
#[serde(rename = "updateSheet")]
UpdateSheet {
properties: UpdateSheetProperty,
},
#[serde(rename = "deleteSheet")]
DeleteSheet {
#[serde(rename = "sheetId")]
sheet_id: String,
},
}
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct AddSheetProperty {
pub title: String,
pub index: Option<i32>,
}
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct CopySheetSource {
#[serde(rename = "sheetId")]
sheet_id: String,
}
#[derive(Serialize, Deserialize, Debug, Default)]
pub struct CopySheetDestination {
title: Option<String>,
}
impl OperateSheetsRequest {
pub fn builder() -> OperateSheetsRequestBuilder {
OperateSheetsRequestBuilder::default()
}
}
#[derive(Default)]
pub struct OperateSheetsRequestBuilder {
request: OperateSheetsRequest,
}
impl OperateSheetsRequestBuilder {
pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
self.request.spreadsheet_token = spreadsheet_token.to_string();
self
}
pub fn add_sheet(mut self, title: impl ToString, index: Option<i32>) -> Self {
self.request
.requests
.push(OperateSheetsRequestElem::AddSheet {
properties: AddSheetProperty {
title: title.to_string(),
index,
},
});
self
}
pub fn copy_sheet(mut self, source: impl ToString, destination: Option<String>) -> Self {
self.request
.requests
.push(OperateSheetsRequestElem::CopySheet {
source: CopySheetSource {
sheet_id: source.to_string(),
},
destination: CopySheetDestination { title: destination },
});
self
}
pub fn delete_sheet(mut self, sheet_id: impl ToString) -> Self {
self.request
.requests
.push(OperateSheetsRequestElem::DeleteSheet {
sheet_id: sheet_id.to_string(),
});
self
}
pub fn build(mut self) -> OperateSheetsRequest {
self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
self.request
}
}
impl_executable_builder_owned!(
OperateSheetsRequestBuilder,
SpreadsheetSheetService,
OperateSheetsRequest,
BaseResponse<OperateSheetResponse>,
operate
);
impl SpreadsheetSheetService {
pub async fn operate(
&self,
request: OperateSheetsRequest,
option: Option<req_option::RequestOption>,
) -> SDKResult<BaseResponse<OperateSheetResponse>> {
let mut api_req = request.api_request;
api_req.api_path = format!(
"/open-apis/sheets/v2/spreadsheets/{spreadsheet_token}/sheets_batch_update",
spreadsheet_token = request.spreadsheet_token
);
api_req.http_method = reqwest::Method::POST;
api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
let api_resp = crate::core::http::Transport::request(api_req, &self.config, option).await?;
Ok(api_resp)
}
}
#[derive(Deserialize, Debug)]
pub struct OperateSheetResponse {
pub replies: Vec<OperateSheetReply>,
}
impl ApiResponseTrait for OperateSheetResponse {
fn data_format() -> ResponseFormat {
ResponseFormat::Data
}
}
#[derive(Deserialize, Debug)]
pub enum OperateSheetReply {
#[serde(rename = "addSheet")]
AddSheet { properties: SheetResponse },
#[serde(rename = "copySheet")]
CopySheet { properties: SheetResponse },
#[serde(rename = "updateSheet")]
UpdateSheet { properties: UpdateSheetProperty },
#[serde(rename = "deleteSheet")]
DeleteSheet {
result: bool,
#[serde(rename = "sheetId")]
sheet_id: String,
},
}
#[derive(Deserialize, Debug)]
pub struct SheetResponse {
#[serde(rename = "sheetId")]
pub sheet_id: String,
pub title: String,
pub index: Option<i32>,
}