1use crate::types::{Column, Row, Table, TableReference};
2use crate::{ClientTablesError, Error, Limiter, RawClient, ResponseValue, RichRow, RowUpdateResultCorrect, RowsUpsertResultCorrect, TableId, types};
3use crate::{ItemsList, ValueFormatProvider, paginate_all};
4use errgonomic::handle;
5use serde::de::DeserializeOwned;
6use std::collections::HashMap;
7use std::time::Duration;
8use thiserror::Error;
9use tokio::time::sleep;
10
11pub struct Client {
12 pub raw: RawClient,
13 pub limiter: Limiter,
14}
15
16#[allow(clippy::too_many_arguments)]
17#[allow(clippy::needless_lifetimes)]
18impl Client {
19 pub const BASE_URL: &'static str = RawClient::BASE_URL;
20
21 pub fn new(baseurl: &str) -> Self {
22 let raw = RawClient::new(baseurl);
23 let limiter = Limiter::default();
24 Self {
25 raw,
26 limiter,
27 }
28 }
29
30 pub fn new_with_client(baseurl: &str, client: reqwest::Client) -> Self {
31 let raw = RawClient::new_with_client(baseurl, client);
32 let limiter = Limiter::default();
33 Self {
34 raw,
35 limiter,
36 }
37 }
38
39 pub fn new_with_key(api_key: &str) -> reqwest::Result<Self> {
40 let raw = RawClient::new_with_key(api_key)?;
41 let limiter = Limiter::default();
42
43 Ok(Self {
44 raw,
45 limiter,
46 })
47 }
48
49 pub async fn list_categories<'a>(&'a self) -> Result<ResponseValue<types::DocCategoryList>, Error<types::ListCategoriesResponse>> {
50 self.limiter.read.until_ready().await;
51 self.raw.list_categories().await
52 }
53
54 pub async fn list_docs<'a>(&'a self, folder_id: Option<&'a str>, in_gallery: Option<bool>, is_owner: Option<bool>, is_published: Option<bool>, is_starred: Option<bool>, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, query: Option<&'a str>, source_doc: Option<&'a str>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::DocList>, Error<types::ListDocsResponse>> {
55 self.limiter.list_docs.until_ready().await;
56 self.raw
57 .list_docs(folder_id, in_gallery, is_owner, is_published, is_starred, limit, page_token, query, source_doc, workspace_id)
58 .await
59 }
60
61 pub async fn create_doc<'a>(&'a self, body: &'a types::DocCreate) -> Result<ResponseValue<types::DocumentCreationResult>, Error<types::CreateDocResponse>> {
62 self.limiter.write_doc_content.until_ready().await;
63 self.raw.create_doc(body).await
64 }
65
66 pub async fn get_doc<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::Doc>, Error<types::GetDocResponse>> {
67 self.limiter.read.until_ready().await;
68 self.raw.get_doc(doc_id).await
69 }
70
71 pub async fn delete_doc<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::DocDelete>, Error<types::DeleteDocResponse>> {
72 self.limiter.write_doc_content.until_ready().await;
73 self.raw.delete_doc(doc_id).await
74 }
75
76 pub async fn update_doc<'a>(&'a self, doc_id: &'a str, body: &'a types::DocUpdate) -> Result<ResponseValue<types::DocUpdateResult>, Error<types::UpdateDocResponse>> {
77 self.limiter.write_doc_content.until_ready().await;
78 self.raw.update_doc(doc_id, body).await
79 }
80
81 pub async fn get_sharing_metadata<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::AclMetadata>, Error<types::GetSharingMetadataResponse>> {
82 self.limiter.read.until_ready().await;
83 self.raw.get_sharing_metadata(doc_id).await
84 }
85
86 pub async fn get_permissions<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::Acl>, Error<types::GetPermissionsResponse>> {
87 self.limiter.read.until_ready().await;
88 self.raw.get_permissions(doc_id, limit, page_token).await
89 }
90
91 pub async fn add_permission<'a>(&'a self, doc_id: &'a str, body: &'a types::AddPermissionRequest) -> Result<ResponseValue<types::AddPermissionResult>, Error<types::AddPermissionResponse>> {
92 self.limiter.write.until_ready().await;
93 self.raw.add_permission(doc_id, body).await
94 }
95
96 pub async fn delete_permission<'a>(&'a self, doc_id: &'a str, permission_id: &'a str) -> Result<ResponseValue<types::DeletePermissionResult>, Error<types::DeletePermissionResponse>> {
97 self.limiter.write.until_ready().await;
98 self.raw.delete_permission(doc_id, permission_id).await
99 }
100
101 pub async fn search_principals<'a>(&'a self, doc_id: &'a str, query: Option<&'a str>) -> Result<ResponseValue<types::SearchPrincipalsResponse>, Error<types::SearchPrincipalsResponse>> {
102 self.limiter.read.until_ready().await;
103 self.raw.search_principals(doc_id, query).await
104 }
105
106 pub async fn get_acl_settings<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::AclSettings>, Error<types::GetAclSettingsResponse>> {
107 self.limiter.read.until_ready().await;
108 self.raw.get_acl_settings(doc_id).await
109 }
110
111 pub async fn update_acl_settings<'a>(&'a self, doc_id: &'a str, body: &'a types::UpdateAclSettingsRequest) -> Result<ResponseValue<types::AclSettings>, Error<types::UpdateAclSettingsResponse>> {
112 self.limiter.write.until_ready().await;
113 self.raw.update_acl_settings(doc_id, body).await
114 }
115
116 pub async fn publish_doc<'a>(&'a self, doc_id: &'a str, body: &'a types::DocPublish) -> Result<ResponseValue<types::PublishResult>, Error<types::PublishDocResponse>> {
117 self.limiter.write_doc_content.until_ready().await;
118 self.raw.publish_doc(doc_id, body).await
119 }
120
121 pub async fn unpublish_doc<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::UnpublishResult>, Error<types::UnpublishDocResponse>> {
122 self.limiter.write_doc_content.until_ready().await;
123 self.raw.unpublish_doc(doc_id).await
124 }
125
126 pub async fn list_pages<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::PageList>, Error<types::ListPagesResponse>> {
127 self.limiter.read.until_ready().await;
128 self.raw.list_pages(doc_id, limit, page_token).await
129 }
130
131 pub async fn create_page<'a>(&'a self, doc_id: &'a str, body: &'a types::PageCreate) -> Result<ResponseValue<types::PageCreateResult>, Error<types::CreatePageResponse>> {
132 self.limiter.write_doc_content.until_ready().await;
133 self.raw.create_page(doc_id, body).await
134 }
135
136 pub async fn get_page<'a>(&'a self, doc_id: &'a str, page_id_or_name: &'a str) -> Result<ResponseValue<types::Page>, Error<types::GetPageResponse>> {
137 self.limiter.read.until_ready().await;
138 self.raw.get_page(doc_id, page_id_or_name).await
139 }
140
141 pub async fn update_page<'a>(&'a self, doc_id: &'a str, page_id_or_name: &'a str, body: &'a types::PageUpdate) -> Result<ResponseValue<types::PageUpdateResult>, Error<types::UpdatePageResponse>> {
142 self.limiter.write_doc_content.until_ready().await;
143 self.raw.update_page(doc_id, page_id_or_name, body).await
144 }
145
146 pub async fn delete_page<'a>(&'a self, doc_id: &'a str, page_id_or_name: &'a str) -> Result<ResponseValue<types::PageDeleteResult>, Error<types::DeletePageResponse>> {
147 self.limiter.write_doc_content.until_ready().await;
148 self.raw.delete_page(doc_id, page_id_or_name).await
149 }
150
151 pub async fn begin_page_content_export<'a>(&'a self, doc_id: &'a str, page_id_or_name: &'a str, body: &'a types::BeginPageContentExportRequest) -> Result<ResponseValue<types::BeginPageContentExportResponse>, Error<types::BeginPageContentExportResponse>> {
152 self.limiter.write_doc_content.until_ready().await;
153 self.raw
154 .begin_page_content_export(doc_id, page_id_or_name, body)
155 .await
156 }
157
158 pub async fn get_page_content_export_status<'a>(&'a self, doc_id: &'a str, page_id_or_name: &'a str, request_id: &'a str) -> Result<ResponseValue<types::PageContentExportStatusResponse>, Error<types::GetPageContentExportStatusResponse>> {
159 self.limiter.read.until_ready().await;
160 self.raw
161 .get_page_content_export_status(doc_id, page_id_or_name, request_id)
162 .await
163 }
164
165 pub async fn list_tables<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, sort_by: Option<types::SortBy>, table_types: Option<&'a ::std::vec::Vec<types::TableTypeEnum>>) -> Result<ResponseValue<types::TableList>, Error<types::ListTablesResponse>> {
166 self.limiter.read.until_ready().await;
167 self.raw
168 .list_tables(doc_id, limit, page_token, sort_by, table_types)
169 .await
170 }
171
172 pub async fn get_table<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, use_updated_table_layouts: Option<bool>) -> Result<ResponseValue<types::Table>, Error<types::GetTableResponse>> {
173 self.limiter.read.until_ready().await;
174 self.raw
175 .get_table(doc_id, table_id_or_name, use_updated_table_layouts)
176 .await
177 }
178
179 pub async fn list_columns<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, visible_only: Option<bool>) -> Result<ResponseValue<types::ColumnList>, Error<types::ListColumnsResponse>> {
180 self.limiter.read.until_ready().await;
181 self.raw
182 .list_columns(doc_id, table_id_or_name, limit, page_token, visible_only)
183 .await
184 }
185
186 pub async fn list_rows<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, query: Option<&'a str>, sort_by: Option<types::RowsSortBy>, sync_token: Option<&'a str>, use_column_names: Option<bool>, value_format: Option<types::ValueFormat>, visible_only: Option<bool>) -> Result<ResponseValue<types::RowList>, Error<types::ListRowsResponse>> {
187 self.limiter.read.until_ready().await;
188 self.raw
189 .list_rows(doc_id, table_id_or_name, limit, page_token, query, sort_by, sync_token, use_column_names, value_format, visible_only)
190 .await
191 }
192
193 #[deprecated = "use upsert_rows_correct"]
194 pub async fn upsert_rows<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, disable_parsing: Option<bool>, body: &'a types::RowsUpsert) -> Result<ResponseValue<types::RowsUpsertResult>, Error<types::UpsertRowsResponse>> {
195 self.limiter.write_doc_content.until_ready().await;
196 self.raw
197 .upsert_rows(doc_id, table_id_or_name, disable_parsing, body)
198 .await
199 }
200
201 pub async fn delete_rows<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, body: &'a types::RowsDelete) -> Result<ResponseValue<types::RowsDeleteResult>, Error<types::DeleteRowsResponse>> {
202 self.limiter.write_doc_content.until_ready().await;
203 self.raw.delete_rows(doc_id, table_id_or_name, body).await
204 }
205
206 #[deprecated = "use get_row_correct"]
207 pub async fn get_row<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str, use_column_names: Option<bool>, value_format: Option<types::ValueFormat>) -> Result<ResponseValue<types::RowDetail>, Error<types::GetRowResponse>> {
208 self.limiter.read.until_ready().await;
209 self.raw
210 .get_row(doc_id, table_id_or_name, row_id_or_name, use_column_names, value_format)
211 .await
212 }
213
214 pub async fn get_row_correct<'a, T: DeserializeOwned + ValueFormatProvider>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str, use_column_names: Option<bool>) -> Result<ResponseValue<T>, Error<types::GetRowResponse>> {
215 self.limiter.read.until_ready().await;
216 self.raw
217 .get_row_correct(doc_id, table_id_or_name, row_id_or_name, use_column_names)
218 .await
219 }
220
221 pub async fn update_row<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str, disable_parsing: Option<bool>, body: &'a types::RowUpdate) -> Result<ResponseValue<types::RowUpdateResult>, Error<types::UpdateRowResponse>> {
222 self.limiter.write_doc_content.until_ready().await;
223 self.raw
224 .update_row(doc_id, table_id_or_name, row_id_or_name, disable_parsing, body)
225 .await
226 }
227
228 pub async fn delete_row<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str) -> Result<ResponseValue<types::RowDeleteResult>, Error<types::DeleteRowResponse>> {
229 self.limiter.write_doc_content.until_ready().await;
230 self.raw
231 .delete_row(doc_id, table_id_or_name, row_id_or_name)
232 .await
233 }
234
235 pub async fn push_button<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str, column_id_or_name: &'a str) -> Result<ResponseValue<types::PushButtonResult>, Error<types::PushButtonResponse>> {
236 self.limiter.write_doc_content.until_ready().await;
237 self.raw
238 .push_button(doc_id, table_id_or_name, row_id_or_name, column_id_or_name)
239 .await
240 }
241
242 pub async fn get_column<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, column_id_or_name: &'a str) -> Result<ResponseValue<types::ColumnDetail>, Error<types::GetColumnResponse>> {
243 self.limiter.read.until_ready().await;
244 self.raw
245 .get_column(doc_id, table_id_or_name, column_id_or_name)
246 .await
247 }
248
249 pub async fn list_formulas<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, sort_by: Option<types::SortBy>) -> Result<ResponseValue<types::FormulaList>, Error<types::ListFormulasResponse>> {
250 self.limiter.read.until_ready().await;
251 self.raw
252 .list_formulas(doc_id, limit, page_token, sort_by)
253 .await
254 }
255
256 pub async fn get_formula<'a>(&'a self, doc_id: &'a str, formula_id_or_name: &'a str) -> Result<ResponseValue<types::Formula>, Error<types::GetFormulaResponse>> {
257 self.limiter.read.until_ready().await;
258 self.raw.get_formula(doc_id, formula_id_or_name).await
259 }
260
261 pub async fn list_controls<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, sort_by: Option<types::SortBy>) -> Result<ResponseValue<types::ControlList>, Error<types::ListControlsResponse>> {
262 self.limiter.read.until_ready().await;
263 self.raw
264 .list_controls(doc_id, limit, page_token, sort_by)
265 .await
266 }
267
268 pub async fn get_control<'a>(&'a self, doc_id: &'a str, control_id_or_name: &'a str) -> Result<ResponseValue<types::Control>, Error<types::GetControlResponse>> {
269 self.limiter.read.until_ready().await;
270 self.raw.get_control(doc_id, control_id_or_name).await
271 }
272
273 pub async fn list_custom_doc_domains<'a>(&'a self, doc_id: &'a str) -> Result<ResponseValue<types::CustomDocDomainList>, Error<types::ListCustomDocDomainsResponse>> {
274 self.limiter.read.until_ready().await;
275 self.raw.list_custom_doc_domains(doc_id).await
276 }
277
278 pub async fn add_custom_doc_domain<'a>(&'a self, doc_id: &'a str, body: &'a types::AddCustomDocDomainRequest) -> Result<ResponseValue<types::AddCustomDocDomainResponse>, Error<types::AddCustomDocDomainResponse>> {
279 self.limiter.write.until_ready().await;
280 self.raw.add_custom_doc_domain(doc_id, body).await
281 }
282
283 pub async fn delete_custom_doc_domain<'a>(&'a self, doc_id: &'a str, custom_doc_domain: &'a str) -> Result<ResponseValue<types::DeleteCustomDocDomainResponse>, Error<types::DeleteCustomDocDomainResponse>> {
284 self.limiter.write.until_ready().await;
285 self.raw
286 .delete_custom_doc_domain(doc_id, custom_doc_domain)
287 .await
288 }
289
290 pub async fn update_custom_doc_domain<'a>(&'a self, doc_id: &'a str, custom_doc_domain: &'a str, body: &'a types::UpdateCustomDocDomainRequest) -> Result<ResponseValue<types::UpdateCustomDocDomainResponse>, Error<types::UpdateCustomDocDomainResponse>> {
291 self.limiter.write.until_ready().await;
292 self.raw
293 .update_custom_doc_domain(doc_id, custom_doc_domain, body)
294 .await
295 }
296
297 pub async fn get_custom_doc_domain_provider<'a>(&'a self, custom_doc_domain: &'a str) -> Result<ResponseValue<types::CustomDocDomainProviderResponse>, Error<types::GetCustomDocDomainProviderResponse>> {
298 self.limiter.read.until_ready().await;
299 self.raw
300 .get_custom_doc_domain_provider(custom_doc_domain)
301 .await
302 }
303
304 pub async fn get_folder<'a>(&'a self, folder_id: &'a str) -> Result<ResponseValue<types::Folder>, Error<types::GetFolderResponse>> {
305 self.limiter.read.until_ready().await;
306 self.raw.get_folder(folder_id).await
307 }
308
309 pub async fn whoami<'a>(&'a self) -> Result<ResponseValue<types::User>, Error<types::WhoamiResponse>> {
310 self.limiter.read.until_ready().await;
311 self.raw.whoami().await
312 }
313
314 pub async fn resolve_browser_link<'a>(&'a self, degrade_gracefully: Option<bool>, url: &'a str) -> Result<ResponseValue<types::ApiLink>, Error<types::ResolveBrowserLinkResponse>> {
315 self.limiter.read.until_ready().await;
316 self.raw.resolve_browser_link(degrade_gracefully, url).await
317 }
318
319 pub async fn get_mutation_status<'a>(&'a self, request_id: &'a str) -> Result<ResponseValue<types::MutationStatus>, Error<types::GetMutationStatusResponse>> {
320 self.limiter.read.until_ready().await;
321 self.raw.get_mutation_status(request_id).await
322 }
323
324 pub async fn trigger_webhook_automation<'a>(&'a self, doc_id: &'a str, rule_id: &'a str, body: &'a types::WebhookTriggerPayload) -> Result<ResponseValue<types::WebhookTriggerResult>, Error<types::TriggerWebhookAutomationResponse>> {
325 self.limiter.write.until_ready().await;
326 self.raw
327 .trigger_webhook_automation(doc_id, rule_id, body)
328 .await
329 }
330
331 pub async fn list_doc_analytics<'a>(&'a self, direction: Option<types::SortDirection>, doc_ids: Option<&'a ::std::vec::Vec<::std::string::String>>, is_published: Option<bool>, limit: Option<::std::num::NonZeroU64>, order_by: Option<types::DocAnalyticsOrderBy>, page_token: Option<&'a str>, query: Option<&'a str>, scale: Option<types::AnalyticsScale>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::DocAnalyticsCollection>, Error<types::ListDocAnalyticsResponse>> {
332 self.limiter.read_analytics.until_ready().await;
333 self.raw
334 .list_doc_analytics(direction, doc_ids, is_published, limit, order_by, page_token, query, scale, since_date, until_date, workspace_id)
335 .await
336 }
337
338 pub async fn list_page_analytics<'a>(&'a self, doc_id: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>) -> Result<ResponseValue<types::PageAnalyticsCollection>, Error<types::ListPageAnalyticsResponse>> {
339 self.limiter.read_analytics.until_ready().await;
340 self.raw
341 .list_page_analytics(doc_id, limit, page_token, since_date, until_date)
342 .await
343 }
344
345 pub async fn list_doc_analytics_summary<'a>(&'a self, is_published: Option<bool>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::DocAnalyticsSummary>, Error<types::ListDocAnalyticsSummaryResponse>> {
346 self.limiter.read_analytics.until_ready().await;
347 self.raw
348 .list_doc_analytics_summary(is_published, since_date, until_date, workspace_id)
349 .await
350 }
351
352 pub async fn list_pack_analytics<'a>(&'a self, direction: Option<types::SortDirection>, is_published: Option<bool>, limit: Option<::std::num::NonZeroU64>, order_by: Option<types::PackAnalyticsOrderBy>, pack_ids: Option<&'a ::std::vec::Vec<i64>>, page_token: Option<&'a str>, query: Option<&'a str>, scale: Option<types::AnalyticsScale>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::PackAnalyticsCollection>, Error<types::ListPackAnalyticsResponse>> {
353 self.limiter.read_analytics.until_ready().await;
354 self.raw
355 .list_pack_analytics(direction, is_published, limit, order_by, pack_ids, page_token, query, scale, since_date, until_date, workspace_id)
356 .await
357 }
358
359 pub async fn list_pack_analytics_summary<'a>(&'a self, is_published: Option<bool>, pack_ids: Option<&'a ::std::vec::Vec<i64>>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::PackAnalyticsSummary>, Error<types::ListPackAnalyticsSummaryResponse>> {
360 self.limiter.read_analytics.until_ready().await;
361 self.raw
362 .list_pack_analytics_summary(is_published, pack_ids, since_date, until_date, workspace_id)
363 .await
364 }
365
366 pub async fn list_pack_formula_analytics<'a>(&'a self, pack_id: ::std::num::NonZeroU64, direction: Option<types::SortDirection>, limit: Option<::std::num::NonZeroU64>, order_by: Option<types::PackFormulaAnalyticsOrderBy>, pack_formula_names: Option<&'a ::std::vec::Vec<::std::string::String>>, pack_formula_types: Option<&'a ::std::vec::Vec<types::PackFormulaType>>, page_token: Option<&'a str>, scale: Option<types::AnalyticsScale>, since_date: Option<&'a ::chrono::naive::NaiveDate>, until_date: Option<&'a ::chrono::naive::NaiveDate>) -> Result<ResponseValue<types::PackFormulaAnalyticsCollection>, Error<types::ListPackFormulaAnalyticsResponse>> {
367 self.limiter.read_analytics.until_ready().await;
368 self.raw
369 .list_pack_formula_analytics(pack_id, direction, limit, order_by, pack_formula_names, pack_formula_types, page_token, scale, since_date, until_date)
370 .await
371 }
372
373 pub async fn get_analytics_last_updated<'a>(&'a self) -> Result<ResponseValue<types::AnalyticsLastUpdatedResponse>, Error<types::GetAnalyticsLastUpdatedResponse>> {
374 self.limiter.read_analytics.until_ready().await;
375 self.raw.get_analytics_last_updated().await
376 }
377
378 pub async fn list_workspace_members<'a>(&'a self, workspace_id: &'a str, included_roles: Option<&'a ::std::vec::Vec<types::WorkspaceUserRole>>, page_token: Option<&'a str>) -> Result<ResponseValue<types::WorkspaceMembersList>, Error<types::ListWorkspaceMembersResponse>> {
379 self.limiter.read.until_ready().await;
380 self.raw
381 .list_workspace_members(workspace_id, included_roles, page_token)
382 .await
383 }
384
385 pub async fn change_user_role<'a>(&'a self, workspace_id: &'a str, body: &'a types::ChangeRole) -> Result<ResponseValue<types::ChangeRoleResult>, Error<types::ChangeUserRoleResponse>> {
386 self.limiter.write.until_ready().await;
387 self.raw.change_user_role(workspace_id, body).await
388 }
389
390 pub async fn list_workspace_role_activity<'a>(&'a self, workspace_id: &'a str) -> Result<ResponseValue<types::GetWorkspaceRoleActivity>, Error<types::ListWorkspaceRoleActivityResponse>> {
391 self.limiter.read.until_ready().await;
392 self.raw.list_workspace_role_activity(workspace_id).await
393 }
394
395 pub async fn list_packs<'a>(&'a self, access_type: Option<types::PackAccessType>, access_types: Option<&'a ::std::vec::Vec<types::PackAccessType>>, direction: Option<types::SortDirection>, exclude_individual_acls: Option<bool>, exclude_public_packs: Option<bool>, exclude_workspace_acls: Option<bool>, limit: Option<::std::num::NonZeroU64>, only_workspace_id: Option<&'a str>, pack_entrypoint: Option<types::PackEntrypoint>, page_token: Option<&'a str>, parent_workspace_ids: Option<&'a ::std::vec::Vec<::std::string::String>>, sort_by: Option<types::PacksSortBy>) -> Result<ResponseValue<types::PackSummaryList>, Error<types::ListPacksResponse>> {
396 self.limiter.read.until_ready().await;
397 self.raw
398 .list_packs(access_type, access_types, direction, exclude_individual_acls, exclude_public_packs, exclude_workspace_acls, limit, only_workspace_id, pack_entrypoint, page_token, parent_workspace_ids, sort_by)
399 .await
400 }
401
402 pub async fn create_pack<'a>(&'a self, body: &'a types::CreatePackRequest) -> Result<ResponseValue<types::CreatePackResponse>, Error<types::CreatePackResponse>> {
403 self.limiter.write.until_ready().await;
404 self.raw.create_pack(body).await
405 }
406
407 pub async fn get_pack<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::Pack>, Error<types::GetPackResponse>> {
408 self.limiter.read.until_ready().await;
409 self.raw.get_pack(pack_id).await
410 }
411
412 pub async fn delete_pack<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::DeletePackResponse>, Error<types::DeletePackResponse>> {
413 self.limiter.write.until_ready().await;
414 self.raw.delete_pack(pack_id).await
415 }
416
417 pub async fn update_pack<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::UpdatePackRequest) -> Result<ResponseValue<types::Pack>, Error<types::UpdatePackResponse>> {
418 self.limiter.write.until_ready().await;
419 self.raw.update_pack(pack_id, body).await
420 }
421
422 pub async fn get_pack_configuration_schema<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::GetPackConfigurationJsonSchemaResponse>, Error<types::GetPackConfigurationSchemaResponse>> {
423 self.limiter.read.until_ready().await;
424 self.raw.get_pack_configuration_schema(pack_id).await
425 }
426
427 pub async fn list_pack_versions<'a>(&'a self, pack_id: ::std::num::NonZeroU64, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::PackVersionList>, Error<types::ListPackVersionsResponse>> {
428 self.limiter.read.until_ready().await;
429 self.raw
430 .list_pack_versions(pack_id, limit, page_token)
431 .await
432 }
433
434 pub async fn get_next_pack_version<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::GetNextPackVersionRequest) -> Result<ResponseValue<types::NextPackVersionInfo>, Error<types::GetNextPackVersionResponse>> {
435 self.limiter.write.until_ready().await;
436 self.raw.get_next_pack_version(pack_id, body).await
437 }
438
439 pub async fn get_pack_version_diffs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, base_pack_version: &'a str, target_pack_version: &'a str) -> Result<ResponseValue<types::PackVersionDiffs>, Error<types::GetPackVersionDiffsResponse>> {
440 self.limiter.read.until_ready().await;
441 self.raw
442 .get_pack_version_diffs(pack_id, base_pack_version, target_pack_version)
443 .await
444 }
445
446 pub async fn register_pack_version<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_version: &'a str, body: &'a types::RegisterPackVersionRequest) -> Result<ResponseValue<types::PackVersionUploadInfo>, Error<types::RegisterPackVersionResponse>> {
447 self.limiter.write.until_ready().await;
448 self.raw
449 .register_pack_version(pack_id, pack_version, body)
450 .await
451 }
452
453 pub async fn pack_version_upload_complete<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_version: &'a str, body: &'a types::CreatePackVersionRequest) -> Result<ResponseValue<types::CreatePackVersionResponse>, Error<types::PackVersionUploadCompleteResponse>> {
454 self.limiter.write.until_ready().await;
455 self.raw
456 .pack_version_upload_complete(pack_id, pack_version, body)
457 .await
458 }
459
460 pub async fn list_pack_releases<'a>(&'a self, pack_id: ::std::num::NonZeroU64, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::PackReleaseList>, Error<types::ListPackReleasesResponse>> {
461 self.limiter.read.until_ready().await;
462 self.raw
463 .list_pack_releases(pack_id, limit, page_token)
464 .await
465 }
466
467 pub async fn create_pack_release<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::CreatePackReleaseRequest) -> Result<ResponseValue<types::PackRelease>, Error<types::CreatePackReleaseResponse>> {
468 self.limiter.write.until_ready().await;
469 self.raw.create_pack_release(pack_id, body).await
470 }
471
472 pub async fn update_pack_release<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_release_id: ::std::num::NonZeroU64, body: &'a types::UpdatePackReleaseRequest) -> Result<ResponseValue<types::PackRelease>, Error<types::UpdatePackReleaseResponse>> {
473 self.limiter.write.until_ready().await;
474 self.raw
475 .update_pack_release(pack_id, pack_release_id, body)
476 .await
477 }
478
479 pub async fn get_pack_oauth_config<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::PackOauthConfigMetadata>, Error<types::GetPackOauthConfigResponse>> {
480 self.limiter.read.until_ready().await;
481 self.raw.get_pack_oauth_config(pack_id).await
482 }
483
484 pub async fn set_pack_oauth_config<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::SetPackOauthConfigRequest) -> Result<ResponseValue<types::PackOauthConfigMetadata>, Error<types::SetPackOauthConfigResponse>> {
485 self.limiter.write.until_ready().await;
486 self.raw.set_pack_oauth_config(pack_id, body).await
487 }
488
489 pub async fn get_pack_system_connection<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::PackSystemConnectionMetadata>, Error<types::GetPackSystemConnectionResponse>> {
490 self.limiter.read.until_ready().await;
491 self.raw.get_pack_system_connection(pack_id).await
492 }
493
494 pub async fn set_pack_system_connection<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::SetPackSystemConnectionRequest) -> Result<ResponseValue<types::PackSystemConnectionMetadata>, Error<types::SetPackSystemConnectionResponse>> {
495 self.limiter.write.until_ready().await;
496 self.raw.set_pack_system_connection(pack_id, body).await
497 }
498
499 pub async fn patch_pack_system_connection<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::PatchPackSystemConnectionRequest) -> Result<ResponseValue<types::PackSystemConnectionMetadata>, Error<types::PatchPackSystemConnectionResponse>> {
500 self.limiter.write.until_ready().await;
501 self.raw.patch_pack_system_connection(pack_id, body).await
502 }
503
504 pub async fn get_pack_permissions<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::PackPermissionList>, Error<types::GetPackPermissionsResponse>> {
505 self.limiter.read.until_ready().await;
506 self.raw.get_pack_permissions(pack_id).await
507 }
508
509 pub async fn add_pack_permission<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::AddPackPermissionRequest) -> Result<ResponseValue<types::AddPackPermissionResponse>, Error<types::AddPackPermissionResponse>> {
510 self.limiter.write.until_ready().await;
511 self.raw.add_pack_permission(pack_id, body).await
512 }
513
514 pub async fn delete_pack_permission<'a>(&'a self, pack_id: ::std::num::NonZeroU64, permission_id: &'a str) -> Result<ResponseValue<types::DeletePackPermissionResponse>, Error<types::DeletePackPermissionResponse>> {
515 self.limiter.write.until_ready().await;
516 self.raw
517 .delete_pack_permission(pack_id, permission_id)
518 .await
519 }
520
521 pub async fn list_user_pack_invitations<'a>(&'a self, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::PackInvitationWithPackList>, Error<types::ListUserPackInvitationsResponse>> {
522 self.limiter.read.until_ready().await;
523 self.raw.list_user_pack_invitations(limit, page_token).await
524 }
525
526 pub async fn list_pack_invitations<'a>(&'a self, pack_id: ::std::num::NonZeroU64, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::PackInvitationList>, Error<types::ListPackInvitationsResponse>> {
527 self.limiter.read.until_ready().await;
528 self.raw
529 .list_pack_invitations(pack_id, limit, page_token)
530 .await
531 }
532
533 pub async fn create_pack_invitation<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::CreatePackInvitationRequest) -> Result<ResponseValue<types::CreatePackInvitationResponse>, Error<types::CreatePackInvitationResponse>> {
534 self.limiter.write.until_ready().await;
535 self.raw.create_pack_invitation(pack_id, body).await
536 }
537
538 pub async fn update_pack_invitation<'a>(&'a self, pack_id: ::std::num::NonZeroU64, invitation_id: &'a ::uuid::Uuid, body: &'a types::UpdatePackInvitationRequest) -> Result<ResponseValue<types::UpdatePackInvitationResponse>, Error<types::UpdatePackInvitationResponse>> {
539 self.limiter.write.until_ready().await;
540 self.raw
541 .update_pack_invitation(pack_id, invitation_id, body)
542 .await
543 }
544
545 pub async fn delete_pack_invitation<'a>(&'a self, pack_id: ::std::num::NonZeroU64, invitation_id: &'a ::uuid::Uuid) -> Result<ResponseValue<types::DeletePackInvitationResponse>, Error<types::DeletePackInvitationResponse>> {
546 self.limiter.write.until_ready().await;
547 self.raw
548 .delete_pack_invitation(pack_id, invitation_id)
549 .await
550 }
551
552 pub async fn reply_to_pack_invitation<'a>(&'a self, invitation_id: &'a ::uuid::Uuid, body: &'a types::HandlePackInvitationRequest) -> Result<ResponseValue<types::HandlePackInvitationResponse>, Error<types::ReplyToPackInvitationResponse>> {
553 self.limiter.write.until_ready().await;
554 self.raw.reply_to_pack_invitation(invitation_id, body).await
555 }
556
557 pub async fn list_pack_makers<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::ListPackMakersResponse>, Error<types::ListPackMakersResponse>> {
558 self.limiter.read.until_ready().await;
559 self.raw.list_pack_makers(pack_id).await
560 }
561
562 pub async fn add_pack_maker<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::AddPackMakerRequest) -> Result<ResponseValue<types::AddPackMakerResponse>, Error<types::AddPackMakerResponse>> {
563 self.limiter.write.until_ready().await;
564 self.raw.add_pack_maker(pack_id, body).await
565 }
566
567 pub async fn delete_pack_maker<'a>(&'a self, pack_id: ::std::num::NonZeroU64, login_id: &'a str) -> Result<ResponseValue<types::DeletePackMakerResponse>, Error<types::DeletePackMakerResponse>> {
568 self.limiter.write.until_ready().await;
569 self.raw.delete_pack_maker(pack_id, login_id).await
570 }
571
572 pub async fn list_pack_categories<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::ListPackCategoriesResponse>, Error<types::ListPackCategoriesResponse>> {
573 self.limiter.read.until_ready().await;
574 self.raw.list_pack_categories(pack_id).await
575 }
576
577 pub async fn add_pack_category<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::AddPackCategoryRequest) -> Result<ResponseValue<types::AddPackCategoryResponse>, Error<types::AddPackCategoryResponse>> {
578 self.limiter.write.until_ready().await;
579 self.raw.add_pack_category(pack_id, body).await
580 }
581
582 pub async fn delete_pack_category<'a>(&'a self, pack_id: ::std::num::NonZeroU64, category_name: &'a str) -> Result<ResponseValue<types::DeletePackCategoryResponse>, Error<types::DeletePackCategoryResponse>> {
583 self.limiter.write.until_ready().await;
584 self.raw.delete_pack_category(pack_id, category_name).await
585 }
586
587 pub async fn upload_pack_asset<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::UploadPackAssetRequest) -> Result<ResponseValue<types::PackAssetUploadInfo>, Error<types::UploadPackAssetResponse>> {
588 self.limiter.write.until_ready().await;
589 self.raw.upload_pack_asset(pack_id, body).await
590 }
591
592 pub async fn upload_pack_source_code<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::UploadPackSourceCodeRequest) -> Result<ResponseValue<types::PackSourceCodeUploadInfo>, Error<types::UploadPackSourceCodeResponse>> {
593 self.limiter.write.until_ready().await;
594 self.raw.upload_pack_source_code(pack_id, body).await
595 }
596
597 pub async fn pack_asset_upload_complete<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_asset_id: &'a str, pack_asset_type: types::PackAssetType) -> Result<ResponseValue<types::PackAssetUploadCompleteResponse>, Error<types::PackAssetUploadCompleteResponse>> {
598 self.limiter.write.until_ready().await;
599 self.raw
600 .pack_asset_upload_complete(pack_id, pack_asset_id, pack_asset_type)
601 .await
602 }
603
604 pub async fn pack_source_code_upload_complete<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_version: &'a str, body: &'a types::PackSourceCodeUploadCompleteRequest) -> Result<ResponseValue<types::PackSourceCodeUploadCompleteResponse>, Error<types::PackSourceCodeUploadCompleteResponse>> {
605 self.limiter.write.until_ready().await;
606 self.raw
607 .pack_source_code_upload_complete(pack_id, pack_version, body)
608 .await
609 }
610
611 pub async fn get_pack_source_code<'a>(&'a self, pack_id: ::std::num::NonZeroU64, pack_version: &'a str) -> Result<ResponseValue<types::PackSourceCodeInfo>, Error<types::GetPackSourceCodeResponse>> {
612 self.limiter.read.until_ready().await;
613 self.raw.get_pack_source_code(pack_id, pack_version).await
614 }
615
616 pub async fn list_pack_listings<'a>(&'a self, certified_agents_only: Option<bool>, direction: Option<types::SortDirection>, exclude_individual_acls: Option<bool>, exclude_public_packs: Option<bool>, exclude_workspace_acls: Option<bool>, install_context: Option<types::PackListingInstallContextType>, limit: Option<::std::num::NonZeroU64>, only_workspace_id: Option<&'a str>, order_by: Option<types::PackListingsSortBy>, pack_access_types: Option<&'a types::PackAccessTypes>, pack_entrypoint: Option<types::PackEntrypoint>, pack_ids: Option<&'a ::std::vec::Vec<i64>>, page_token: Option<&'a str>, parent_workspace_ids: Option<&'a ::std::vec::Vec<::std::string::String>>, sort_by: Option<types::PackListingsSortBy>) -> Result<ResponseValue<types::PackListingList>, Error<types::ListPackListingsResponse>> {
617 self.limiter.read.until_ready().await;
618 self.raw
619 .list_pack_listings(certified_agents_only, direction, exclude_individual_acls, exclude_public_packs, exclude_workspace_acls, install_context, limit, only_workspace_id, order_by, pack_access_types, pack_entrypoint, pack_ids, page_token, parent_workspace_ids, sort_by)
620 .await
621 }
622
623 pub async fn get_pack_listing<'a>(&'a self, pack_id: ::std::num::NonZeroU64, doc_id: Option<&'a str>, ingestion_id: Option<&'a str>, install_context: Option<types::PackListingInstallContextType>, release_channel: Option<types::IngestionPackReleaseChannel>, workspace_id: Option<&'a str>) -> Result<ResponseValue<types::PackListingDetail>, Error<types::GetPackListingResponse>> {
624 self.limiter.read.until_ready().await;
625 self.raw
626 .get_pack_listing(pack_id, doc_id, ingestion_id, install_context, release_channel, workspace_id)
627 .await
628 }
629
630 pub async fn list_pack_logs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, doc_id: &'a str, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, limit: Option<::std::num::NonZeroU64>, log_types: Option<&'a ::std::vec::Vec<types::PackLogType>>, order: Option<types::ListPackLogsOrder>, page_token: Option<&'a str>, q: Option<&'a str>, request_ids: Option<&'a ::std::vec::Vec<::std::string::String>>) -> Result<ResponseValue<types::PackLogsList>, Error<types::ListPackLogsResponse>> {
631 self.limiter.read.until_ready().await;
632 self.raw
633 .list_pack_logs(pack_id, doc_id, after_timestamp, before_timestamp, limit, log_types, order, page_token, q, request_ids)
634 .await
635 }
636
637 pub async fn list_ingestion_logs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, tenant_id: &'a str, root_ingestion_id: &'a ::uuid::Uuid, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, ingestion_execution_id: Option<&'a ::uuid::Uuid>, ingestion_status: Option<types::IngestionStatus>, limit: Option<::std::num::NonZeroU64>, log_types: Option<&'a ::std::vec::Vec<types::PackLogType>>, only_execution_completions: Option<bool>, order: Option<types::ListIngestionLogsOrder>, page_token: Option<&'a str>, q: Option<&'a str>, request_ids: Option<&'a ::std::vec::Vec<::std::string::String>>) -> Result<ResponseValue<types::PackLogsList>, Error<types::ListIngestionLogsResponse>> {
638 self.limiter.read.until_ready().await;
639 self.raw
640 .list_ingestion_logs(pack_id, tenant_id, root_ingestion_id, after_timestamp, before_timestamp, ingestion_execution_id, ingestion_status, limit, log_types, only_execution_completions, order, page_token, q, request_ids)
641 .await
642 }
643
644 pub async fn list_grouped_pack_logs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, doc_id: &'a str, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, limit: Option<::std::num::NonZeroU64>, order: Option<types::ListGroupedPackLogsOrder>, page_token: Option<&'a str>, q: Option<&'a str>) -> Result<ResponseValue<types::GroupedPackLogsList>, Error<types::ListGroupedPackLogsResponse>> {
645 self.limiter.read.until_ready().await;
646 self.raw
647 .list_grouped_pack_logs(pack_id, doc_id, after_timestamp, before_timestamp, limit, order, page_token, q)
648 .await
649 }
650
651 pub async fn list_grouped_ingestion_logs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, tenant_id: &'a str, root_ingestion_id: &'a ::uuid::Uuid, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, ingestion_execution_id: Option<&'a ::uuid::Uuid>, limit: Option<::std::num::NonZeroU64>, order: Option<types::ListGroupedIngestionLogsOrder>, page_token: Option<&'a str>, q: Option<&'a str>) -> Result<ResponseValue<types::GroupedPackLogsList>, Error<types::ListGroupedIngestionLogsResponse>> {
652 self.limiter.read.until_ready().await;
653 self.raw
654 .list_grouped_ingestion_logs(pack_id, tenant_id, root_ingestion_id, after_timestamp, before_timestamp, ingestion_execution_id, limit, order, page_token, q)
655 .await
656 }
657
658 pub async fn list_ingestion_batch_executions<'a>(&'a self, pack_id: ::std::num::NonZeroU64, tenant_id: &'a str, root_ingestion_id: &'a ::uuid::Uuid, datasource: Option<&'a str>, execution_type: Option<types::IngestionExecutionType>, include_deleted_ingestions: Option<bool>, ingestion_execution_id: Option<&'a str>, ingestion_id: Option<&'a str>, ingestion_status: Option<types::IngestionStatus>, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::IngestionBatchExecutionsList>, Error<types::ListIngestionBatchExecutionsResponse>> {
659 self.limiter.read.until_ready().await;
660 self.raw
661 .list_ingestion_batch_executions(pack_id, tenant_id, root_ingestion_id, datasource, execution_type, include_deleted_ingestions, ingestion_execution_id, ingestion_id, ingestion_status, limit, page_token)
662 .await
663 }
664
665 pub async fn list_ingestion_parent_items<'a>(&'a self, pack_id: ::std::num::NonZeroU64, tenant_id: &'a str, root_ingestion_id: &'a ::uuid::Uuid, ingestion_execution_id: &'a ::uuid::Uuid, ingestion_id: &'a ::uuid::Uuid, ingestion_status: Option<types::IngestionStatus>, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>) -> Result<ResponseValue<types::IngestionParentItemsList>, Error<types::ListIngestionParentItemsResponse>> {
666 self.limiter.read.until_ready().await;
667 self.raw
668 .list_ingestion_parent_items(pack_id, tenant_id, root_ingestion_id, ingestion_execution_id, ingestion_id, ingestion_status, limit, page_token)
669 .await
670 }
671
672 pub async fn get_pack_log_details<'a>(&'a self, pack_id: ::std::num::NonZeroU64, tenant_id: &'a str, root_ingestion_id: &'a ::uuid::Uuid, log_id: &'a str, details_key: &'a str) -> Result<ResponseValue<types::PackLogDetails>, Error<types::GetPackLogDetailsResponse>> {
673 self.limiter.read.until_ready().await;
674 self.raw
675 .get_pack_log_details(pack_id, tenant_id, root_ingestion_id, log_id, details_key)
676 .await
677 }
678
679 pub async fn list_pack_featured_docs<'a>(&'a self, pack_id: ::std::num::NonZeroU64) -> Result<ResponseValue<types::PackFeaturedDocsResponse>, Error<types::ListPackFeaturedDocsResponse>> {
680 self.limiter.read.until_ready().await;
681 self.raw.list_pack_featured_docs(pack_id).await
682 }
683
684 pub async fn update_pack_featured_docs<'a>(&'a self, pack_id: ::std::num::NonZeroU64, body: &'a types::UpdatePackFeaturedDocsRequest) -> Result<ResponseValue<types::UpdatePackFeaturedDocsResponse>, Error<types::UpdatePackFeaturedDocsResponse>> {
685 self.limiter.write.until_ready().await;
686 self.raw.update_pack_featured_docs(pack_id, body).await
687 }
688
689 pub async fn add_go_link<'a>(&'a self, organization_id: &'a str, body: &'a types::AddGoLinkRequest) -> Result<ResponseValue<types::AddGoLinkResult>, Error<types::AddGoLinkResponse>> {
690 self.limiter.write.until_ready().await;
691 self.raw.add_go_link(organization_id, body).await
692 }
693
694 pub async fn list_agent_session_ids<'a>(&'a self, tenant_id: &'a str, agent_instance_id: &'a ::uuid::Uuid, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, agent_session_id: Option<&'a ::uuid::Uuid>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, limit: Option<::std::num::NonZeroU64>, log_types: Option<&'a ::std::vec::Vec<types::PackLogType>>, order: Option<types::ListAgentSessionIdsOrder>, page_token: Option<&'a str>, q: Option<&'a str>, request_ids: Option<&'a ::std::vec::Vec<::std::string::String>>) -> Result<ResponseValue<types::PackLogsList>, Error<types::ListAgentSessionIdsResponse>> {
695 self.limiter.read.until_ready().await;
696 self.raw
697 .list_agent_session_ids(tenant_id, agent_instance_id, after_timestamp, agent_session_id, before_timestamp, limit, log_types, order, page_token, q, request_ids)
698 .await
699 }
700
701 pub async fn list_agent_logs<'a>(&'a self, tenant_id: &'a str, agent_instance_id: &'a ::uuid::Uuid, after_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, agent_session_id: Option<&'a ::uuid::Uuid>, before_timestamp: Option<&'a ::chrono::DateTime<::chrono::offset::Utc>>, limit: Option<::std::num::NonZeroU64>, log_types: Option<&'a ::std::vec::Vec<types::PackLogType>>, order: Option<types::ListAgentLogsOrder>, page_token: Option<&'a str>, q: Option<&'a str>, request_ids: Option<&'a ::std::vec::Vec<::std::string::String>>) -> Result<ResponseValue<types::PackLogsList>, Error<types::ListAgentLogsResponse>> {
702 self.limiter.read.until_ready().await;
703 self.raw
704 .list_agent_logs(tenant_id, agent_instance_id, after_timestamp, agent_session_id, before_timestamp, limit, log_types, order, page_token, q, request_ids)
705 .await
706 }
707
708 pub async fn get_agent_pack_log_details<'a>(&'a self, tenant_id: &'a str, agent_instance_id: &'a ::uuid::Uuid, log_id: &'a str, details_key: &'a str) -> Result<ResponseValue<types::PackLogDetails>, Error<types::GetAgentPackLogDetailsResponse>> {
709 self.limiter.read.until_ready().await;
710 self.raw
711 .get_agent_pack_log_details(tenant_id, agent_instance_id, log_id, details_key)
712 .await
713 }
714 pub async fn table_refs(&self, doc_id: &str) -> Result<Vec<TableReference>, Error<types::ListTablesResponse>> {
715 paginate_all(move |page_token| async move {
716 self.list_tables(doc_id, None, page_token.as_deref(), None, None)
717 .await
718 .map(|response| response.into_inner())
719 })
720 .await
721 }
722
723 pub async fn tables(&self, doc_id: &str) -> Result<Vec<Table>, ClientTablesError> {
724 use ClientTablesError::*;
725 let table_refs = handle!(self.table_refs(doc_id).await, ListTablesFailed);
726 let mut all_tables = Vec::new();
727 for table_ref in table_refs {
728 let table_response = handle!(self.get_table(doc_id, &table_ref.id, None).await, GetTableFailed);
729 all_tables.push(table_response.into_inner());
730 }
731 Ok(all_tables)
732 }
733
734 pub async fn columns_map(&self, doc_id: &str, table_ids: impl IntoIterator<Item = TableId>) -> Result<HashMap<TableId, Vec<Column>>, Error<types::ListColumnsResponse>> {
735 let mut columns_map = HashMap::new();
736
737 for table_id in table_ids {
738 let table_id_ref = table_id.as_ref();
739 let columns = paginate_all(move |page_token| async move {
740 self.list_columns(doc_id, table_id_ref, None, page_token.as_deref(), None)
741 .await
742 .map(|response| response.into_inner())
743 })
744 .await?;
745
746 columns_map.insert(table_id, columns);
747 }
748
749 Ok(columns_map)
750 }
751
752 #[allow(clippy::too_many_arguments)]
753 pub async fn rows(&self, doc_id: &str, table_id: &str, query: Option<&str>, sort_by: Option<types::RowsSortBy>, sync_token: Option<&str>, use_column_names: Option<bool>, value_format: Option<types::ValueFormat>) -> Result<Vec<Row>, Error<types::ListRowsResponse>> {
754 paginate_all(move |page_token| async move {
755 self.list_rows(doc_id, table_id, None, page_token.as_deref(), query, sort_by, sync_token, use_column_names, value_format, None)
756 .await
757 .map(|response| response.into_inner())
758 })
759 .await
760 }
761
762 #[allow(clippy::too_many_arguments)]
763 pub async fn list_rows_correct<'a, T: DeserializeOwned + ValueFormatProvider>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, limit: Option<::std::num::NonZeroU64>, page_token: Option<&'a str>, query: Option<&'a str>, sort_by: Option<types::RowsSortBy>, sync_token: Option<&'a str>, use_column_names: Option<bool>, visible_only: Option<bool>) -> Result<ResponseValue<ItemsList<T>>, Error<types::ListRowsResponse>> {
764 self.limiter.read.until_ready().await;
765 self.raw
766 .list_rows_correct(doc_id, table_id_or_name, limit, page_token, query, sort_by, sync_token, use_column_names, visible_only)
767 .await
768 }
769
770 #[allow(clippy::too_many_arguments)]
771 pub async fn rows_correct<T: DeserializeOwned + ValueFormatProvider + Clone>(&self, doc_id: &str, table_id: &str, query: Option<&str>, sort_by: Option<types::RowsSortBy>, sync_token: Option<&str>, use_column_names: Option<bool>, visible_only: Option<bool>) -> Result<Vec<T>, Error<types::ListRowsResponse>> {
772 paginate_all(move |page_token| async move {
773 self.list_rows_correct(doc_id, table_id, None, page_token.as_deref(), query, sort_by, sync_token, use_column_names, visible_only)
774 .await
775 .map(|response| response.into_inner())
776 })
777 .await
778 }
779
780 #[allow(clippy::too_many_arguments)]
781 pub async fn rows_map(&self, doc_id: &str, table_ids: impl IntoIterator<Item = TableId>, query: Option<&str>, sort_by: Option<types::RowsSortBy>, sync_token: Option<&str>, use_column_names: Option<bool>, value_format: Option<types::ValueFormat>) -> Result<HashMap<TableId, Vec<Row>>, Error<types::ListRowsResponse>> {
782 let rows_futures = table_ids.into_iter().map(|table_id| async move {
783 let rows = self
784 .rows(doc_id, &table_id, query, sort_by, sync_token, use_column_names, value_format)
785 .await?;
786 Ok::<(TableId, Vec<Row>), Error<types::ListRowsResponse>>((table_id, rows))
787 });
788
789 let mut rows_map = HashMap::new();
790
791 for future in rows_futures {
792 let (table_id, rows) = future.await?;
793 rows_map.insert(table_id, rows);
794 }
795
796 Ok(rows_map)
797 }
798
799 pub async fn upsert_rows_correct<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, disable_parsing: Option<bool>, body: &'a types::RowsUpsert) -> Result<ResponseValue<RowsUpsertResultCorrect>, Error<types::UpsertRowsResponse>> {
800 self.limiter.write_doc_content.until_ready().await;
801 self.raw
802 .upsert_rows_correct(doc_id, table_id_or_name, disable_parsing, body)
803 .await
804 }
805
806 pub async fn upsert_rows_conclusively<'a, T: DeserializeOwned + ValueFormatProvider>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, disable_parsing: Option<bool>, body: &'a types::RowsUpsert, max_attempts: usize, delay_secs: u64) -> Result<UpsertRowsConclusivelyResult<T>, UpsertRowsConclusivelyError> {
807 use UpsertRowsConclusivelyError::*;
808
809 let upsert_result = handle!(
810 self.upsert_rows_correct(doc_id, table_id_or_name, disable_parsing, body)
811 .await,
812 UpsertFailed
813 )
814 .into_inner();
815
816 let row_ids = upsert_result.added_row_ids.clone();
817 let items = handle!(
818 self.wait_for_upserted_rows(doc_id, table_id_or_name, &row_ids, max_attempts, delay_secs)
819 .await,
820 EnsureRowsVisibleFailed,
821 request_id: upsert_result.request_id.clone(),
822 row_ids
823 );
824
825 Ok(UpsertRowsConclusivelyResult {
826 upsert_result,
827 items,
828 })
829 }
830
831 pub async fn wait_for_upserted_rows<T: DeserializeOwned + ValueFormatProvider>(&self, doc_id: &str, table_id: &str, row_ids: &[String], max_attempts: usize, delay_secs: u64) -> Result<Vec<T>, WaitForRowsError> {
833 use WaitForRowsError::*;
834
835 if row_ids.is_empty() {
836 return Ok(Vec::new());
837 }
838
839 let mut rows: Vec<Option<T>> = Vec::with_capacity(row_ids.len());
841 for _ in row_ids {
842 rows.push(None);
843 }
844
845 let delay = Duration::from_secs(delay_secs);
846 let mut attempt = 0;
847
848 while attempt < max_attempts {
849 attempt += 1;
850
851 for (index, row_id) in row_ids.iter().enumerate() {
852 if rows[index].is_some() {
853 continue;
854 }
855
856 let row_result = self
857 .get_row_correct::<T>(doc_id, table_id, row_id, None)
858 .await;
859 match row_result {
860 Ok(row) => rows[index] = Some(row.into_inner()),
861 Err(error) => {
862 let status = error.status().map(|code| code.as_u16());
863 if matches!(status, Some(404)) {
864 continue;
865 }
866 return Err(RequestFailed {
867 attempt,
868 row_id: row_id.clone(),
869 source: Box::new(error),
870 });
871 }
872 }
873 }
874
875 if rows.iter().all(Option::is_some) {
876 break;
877 }
878
879 sleep(delay).await;
880 }
881
882 if rows.iter().any(Option::is_none) {
883 let missing_row_ids = row_ids
884 .iter()
885 .enumerate()
886 .filter(|(index, _)| rows[*index].is_none())
887 .map(|(_, row_id)| row_id.clone())
888 .collect();
889 return Err(RowsMissing {
890 attempts: max_attempts,
891 missing_row_ids,
892 });
893 }
894
895 Ok(rows.into_iter().flatten().collect())
896 }
897
898 pub async fn update_row_correct<'a>(&'a self, doc_id: &'a str, table_id_or_name: &'a str, row_id_or_name: &'a str, disable_parsing: Option<bool>, body: &'a types::RowUpdate) -> Result<ResponseValue<RowUpdateResultCorrect>, Error<types::UpdateRowResponse>> {
899 self.limiter.write_doc_content.until_ready().await;
900 self.raw
901 .update_row_correct(doc_id, table_id_or_name, row_id_or_name, disable_parsing, body)
902 .await
903 }
904}
905
906#[derive(Debug)]
907pub struct UpsertRowsConclusivelyResult<T> {
908 pub upsert_result: RowsUpsertResultCorrect,
909 pub items: Vec<T>,
910}
911
912#[derive(Error, Debug)]
913pub enum UpsertRowsConclusivelyError {
914 #[error("failed to upsert rows")]
915 UpsertFailed { source: Error<types::UpsertRowsResponse> },
916 #[error("failed to ensure rows '{row_ids:?}' are visible for request '{request_id}'")]
917 EnsureRowsVisibleFailed { request_id: String, row_ids: Vec<String>, source: WaitForRowsError },
918}
919
920#[derive(Debug)]
921pub struct UpsertRowsConclusivelyRichResult {
922 pub upsert_result: RowsUpsertResultCorrect,
923 pub rows: Vec<RichRow>,
924}
925
926#[derive(Error, Debug)]
927pub enum UpsertRowsConclusivelyRichError {
928 #[error("failed to upsert rows")]
929 UpsertRowsConclusivelyFailed { source: UpsertRowsConclusivelyError },
930 }
934
935#[derive(Error, Debug)]
936pub enum WaitForRowsError {
937 #[error("get row '{row_id}' attempt {attempt} failed")]
938 RequestFailed { attempt: usize, row_id: String, source: Box<Error<types::GetRowResponse>> },
939 #[error("rows '{missing_row_ids:?}' did not appear after {attempts} attempts")]
940 RowsMissing { attempts: usize, missing_row_ids: Vec<String> },
941}