open_lark/service/cloud_docs/sheets/v3/data_operation/
prepend_data.rs

1use reqwest::Method;
2use serde::{Deserialize, Serialize};
3
4use crate::{
5    core::{
6        api_req::ApiRequest,
7        api_resp::{ApiResponseTrait, BaseResponse, ResponseFormat},
8        constants::AccessTokenType,
9        http::Transport,
10        req_option::RequestOption,
11        SDKResult,
12    },
13    impl_executable_builder_owned,
14    service::sheets::v3::DataOperationService,
15};
16
17use super::{UpdatesInfo, ValueRangeRequest};
18
19impl DataOperationService {
20    /// 插入数据
21    pub async fn prepend_data(
22        &self,
23        request: PrependDataRequest,
24        option: Option<RequestOption>,
25    ) -> SDKResult<BaseResponse<PrependDataResponseData>> {
26        let mut api_req = request.api_request;
27        api_req.http_method = Method::POST;
28        api_req.api_path = format!(
29            "/open-apis/sheets/v3/spreadsheets/{}/values/{}/prepend",
30            request.spreadsheet_token, request.range
31        );
32        api_req.supported_access_token_types = vec![AccessTokenType::Tenant, AccessTokenType::User];
33
34        let api_resp = Transport::request(api_req, &self.config, option).await?;
35
36        Ok(api_resp)
37    }
38}
39
40/// 插入数据请求
41#[derive(Default, Debug, Serialize, Deserialize)]
42pub struct PrependDataRequest {
43    #[serde(skip)]
44    api_request: ApiRequest,
45    /// spreadsheet 的 token
46    spreadsheet_token: String,
47    /// 查询范围,包含 sheetId 与单元格范围两部分
48    range: String,
49    /// 插入数据的方式
50    #[serde(rename = "insertDataOption")]
51    insert_data_option: Option<String>,
52    /// 数据值
53    #[serde(rename = "valueRange")]
54    value_range: ValueRangeRequest,
55}
56
57impl PrependDataRequest {
58    pub fn builder() -> PrependDataRequestBuilder {
59        PrependDataRequestBuilder::default()
60    }
61}
62
63#[derive(Default)]
64pub struct PrependDataRequestBuilder {
65    request: PrependDataRequest,
66}
67
68impl PrependDataRequestBuilder {
69    pub fn spreadsheet_token(mut self, spreadsheet_token: impl ToString) -> Self {
70        self.request.spreadsheet_token = spreadsheet_token.to_string();
71        self
72    }
73
74    pub fn range(mut self, range: impl ToString) -> Self {
75        self.request.range = range.to_string();
76        self
77    }
78
79    pub fn insert_data_option(mut self, insert_data_option: impl ToString) -> Self {
80        self.request.insert_data_option = Some(insert_data_option.to_string());
81        self
82    }
83
84    pub fn values(mut self, values: Vec<Vec<serde_json::Value>>) -> Self {
85        self.request.value_range = ValueRangeRequest {
86            range: self.request.range.clone(),
87            values,
88        };
89        self
90    }
91
92    pub fn build(mut self) -> PrependDataRequest {
93        self.request.api_request.body = serde_json::to_vec(&self.request).unwrap();
94        self.request
95    }
96}
97
98// Trait implementation
99impl_executable_builder_owned!(
100    PrependDataRequestBuilder,
101    DataOperationService,
102    PrependDataRequest,
103    BaseResponse<PrependDataResponseData>,
104    prepend_data
105);
106
107/// 插入数据响应体最外层
108#[derive(Deserialize, Debug)]
109pub struct PrependDataResponseData {
110    /// 表格的 token
111    #[serde(rename = "spreadsheetToken")]
112    pub spreadsheet_token: String,
113    /// 数据更新的位置
114    #[serde(rename = "tableRange")]
115    pub table_range: String,
116    /// sheet 的版本号
117    pub revision: i32,
118    /// 更新的行数
119    pub updates: UpdatesInfo,
120}
121
122impl ApiResponseTrait for PrependDataResponseData {
123    fn data_format() -> ResponseFormat {
124        ResponseFormat::Data
125    }
126}
127
128#[cfg(test)]
129mod test {
130    use serde_json::json;
131
132    use super::PrependDataResponseData;
133
134    #[test]
135    fn test_prepend_data_response() {
136        let json = json!({
137            "spreadsheetToken": "shtcnmBA*****yGehy8",
138            "tableRange": "Sheet1!A1:B2",
139            "revision": 123,
140            "updates": {
141                "updatedRange": "Sheet1!A1:B1",
142                "updatedRows": 1,
143                "updatedColumns": 2,
144                "updatedCells": 2
145            }
146        });
147
148        let response: PrependDataResponseData = serde_json::from_value(json).unwrap();
149        assert_eq!(response.spreadsheet_token, "shtcnmBA*****yGehy8");
150        assert_eq!(response.updates.updated_rows, 1);
151    }
152}