1use std::collections::HashMap;
9
10use chrono::{DateTime, Utc};
11use serde::{Deserialize, Serialize};
12use serde_json::Value;
13
14pub type Extra = HashMap<String, Value>;
16
17#[derive(Debug, Clone, Deserialize, Serialize)]
19#[serde(rename_all = "camelCase")]
20pub struct Actor {
21 pub id: String,
23 #[serde(default)]
25 pub user_id: Option<String>,
26 #[serde(default)]
28 pub name: Option<String>,
29 #[serde(default)]
31 pub username: Option<String>,
32 #[serde(default)]
34 pub title: Option<String>,
35 #[serde(default)]
37 pub description: Option<String>,
38 #[serde(default)]
40 pub is_public: Option<bool>,
41 #[serde(default)]
43 pub created_at: Option<DateTime<Utc>>,
44 #[serde(default)]
46 pub modified_at: Option<DateTime<Utc>>,
47 #[serde(flatten)]
49 pub extra: Extra,
50}
51
52#[derive(Debug, Clone, Deserialize, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct ActorRun {
56 pub id: String,
58 #[serde(default)]
60 pub act_id: Option<String>,
61 #[serde(default)]
63 pub actor_task_id: Option<String>,
64 #[serde(default)]
66 pub user_id: Option<String>,
67 #[serde(default)]
69 pub status: Option<String>,
70 #[serde(default)]
72 pub status_message: Option<String>,
73 #[serde(default)]
75 pub started_at: Option<DateTime<Utc>>,
76 #[serde(default)]
78 pub finished_at: Option<DateTime<Utc>>,
79 #[serde(default)]
81 pub build_id: Option<String>,
82 #[serde(default)]
84 pub default_dataset_id: Option<String>,
85 #[serde(default)]
87 pub default_key_value_store_id: Option<String>,
88 #[serde(default)]
90 pub default_request_queue_id: Option<String>,
91 #[serde(default)]
93 pub container_url: Option<String>,
94 #[serde(flatten)]
96 pub extra: Extra,
97}
98
99pub(crate) const TERMINAL_STATUSES: &[&str] =
101 &["SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT", "TIMED_OUT"];
102
103impl ActorRun {
104 pub fn is_terminal(&self) -> bool {
106 self.status
107 .as_deref()
108 .map(|s| TERMINAL_STATUSES.contains(&s))
109 .unwrap_or(false)
110 }
111}
112
113#[derive(Debug, Clone, Deserialize, Serialize)]
115#[serde(rename_all = "camelCase")]
116pub struct Build {
117 pub id: String,
119 #[serde(default)]
121 pub act_id: Option<String>,
122 #[serde(default)]
124 pub status: Option<String>,
125 #[serde(default)]
127 pub started_at: Option<DateTime<Utc>>,
128 #[serde(default)]
130 pub finished_at: Option<DateTime<Utc>>,
131 #[serde(default)]
133 pub build_number: Option<String>,
134 #[serde(flatten)]
136 pub extra: Extra,
137}
138
139impl Build {
140 pub fn is_terminal(&self) -> bool {
142 self.status
143 .as_deref()
144 .map(|s| TERMINAL_STATUSES.contains(&s))
145 .unwrap_or(false)
146 }
147}
148
149#[derive(Debug, Clone, Deserialize, Serialize)]
151#[serde(rename_all = "camelCase")]
152pub struct Task {
153 pub id: String,
155 #[serde(default)]
157 pub act_id: Option<String>,
158 #[serde(default)]
160 pub user_id: Option<String>,
161 #[serde(default)]
163 pub name: Option<String>,
164 #[serde(default)]
166 pub title: Option<String>,
167 #[serde(default)]
169 pub created_at: Option<DateTime<Utc>>,
170 #[serde(default)]
172 pub modified_at: Option<DateTime<Utc>>,
173 #[serde(flatten)]
175 pub extra: Extra,
176}
177
178#[derive(Debug, Clone, Deserialize, Serialize)]
180#[serde(rename_all = "camelCase")]
181pub struct Dataset {
182 pub id: String,
184 #[serde(default)]
186 pub name: Option<String>,
187 #[serde(default)]
189 pub user_id: Option<String>,
190 #[serde(default)]
192 pub created_at: Option<DateTime<Utc>>,
193 #[serde(default)]
195 pub modified_at: Option<DateTime<Utc>>,
196 #[serde(default)]
198 pub item_count: Option<i64>,
199 #[serde(flatten)]
201 pub extra: Extra,
202}
203
204#[derive(Debug, Clone, Deserialize, Serialize)]
206#[serde(rename_all = "camelCase")]
207pub struct KeyValueStore {
208 pub id: String,
210 #[serde(default)]
212 pub name: Option<String>,
213 #[serde(default)]
215 pub user_id: Option<String>,
216 #[serde(default)]
218 pub created_at: Option<DateTime<Utc>>,
219 #[serde(default)]
221 pub modified_at: Option<DateTime<Utc>>,
222 #[serde(flatten)]
224 pub extra: Extra,
225}
226
227#[derive(Debug, Clone, Deserialize, Serialize)]
229#[serde(rename_all = "camelCase")]
230pub struct KeyValueStoreKey {
231 pub key: String,
233 #[serde(default)]
235 pub size: Option<i64>,
236 #[serde(flatten)]
238 pub extra: Extra,
239}
240
241#[derive(Debug, Clone, Deserialize, Serialize)]
243#[serde(rename_all = "camelCase")]
244pub struct KeyValueStoreKeysPage {
245 #[serde(default)]
247 pub limit: i64,
248 #[serde(default)]
250 pub is_truncated: bool,
251 #[serde(default)]
253 pub exclusive_start_key: Option<String>,
254 #[serde(default)]
256 pub next_exclusive_start_key: Option<String>,
257 #[serde(default)]
259 pub items: Vec<KeyValueStoreKey>,
260}
261
262#[derive(Debug, Clone)]
264pub struct KeyValueStoreRecord {
265 pub key: String,
267 pub value: Vec<u8>,
269 pub content_type: Option<String>,
271}
272
273impl KeyValueStoreRecord {
274 pub fn as_text(&self) -> Result<String, std::string::FromUtf8Error> {
276 String::from_utf8(self.value.clone())
277 }
278
279 pub fn json<T: serde::de::DeserializeOwned>(&self) -> Result<T, serde_json::Error> {
281 serde_json::from_slice(&self.value)
282 }
283}
284
285#[derive(Debug, Clone, Deserialize, Serialize)]
287#[serde(rename_all = "camelCase")]
288pub struct RequestQueue {
289 pub id: String,
291 #[serde(default)]
293 pub name: Option<String>,
294 #[serde(default)]
296 pub user_id: Option<String>,
297 #[serde(default)]
299 pub created_at: Option<DateTime<Utc>>,
300 #[serde(default)]
302 pub modified_at: Option<DateTime<Utc>>,
303 #[serde(default)]
305 pub total_request_count: Option<i64>,
306 #[serde(flatten)]
308 pub extra: Extra,
309}
310
311#[derive(Debug, Clone, Deserialize, Serialize)]
313#[serde(rename_all = "camelCase")]
314pub struct RequestQueueRequest {
315 #[serde(default, skip_serializing_if = "Option::is_none")]
317 pub id: Option<String>,
318 pub url: String,
320 #[serde(default, skip_serializing_if = "Option::is_none")]
322 pub unique_key: Option<String>,
323 #[serde(default, skip_serializing_if = "Option::is_none")]
325 pub method: Option<String>,
326 #[serde(default, skip_serializing_if = "Option::is_none")]
328 pub user_data: Option<Value>,
329 #[serde(flatten)]
331 pub extra: Extra,
332}
333
334#[derive(Debug, Clone, Deserialize, Serialize)]
336#[serde(rename_all = "camelCase")]
337pub struct RequestQueueOperationInfo {
338 pub request_id: String,
340 #[serde(default)]
342 pub was_already_present: bool,
343 #[serde(default)]
345 pub was_already_handled: bool,
346}
347
348#[derive(Debug, Clone, Deserialize, Serialize)]
350#[serde(rename_all = "camelCase")]
351pub struct RequestQueueHead {
352 #[serde(default)]
354 pub limit: i64,
355 #[serde(default)]
357 pub had_multiple_clients: bool,
358 #[serde(default)]
360 pub items: Vec<RequestQueueRequest>,
361 #[serde(flatten)]
363 pub extra: Extra,
364}
365
366#[derive(Debug, Clone, Deserialize, Serialize)]
368#[serde(rename_all = "camelCase")]
369pub struct Schedule {
370 pub id: String,
372 #[serde(default)]
374 pub user_id: Option<String>,
375 #[serde(default)]
377 pub name: Option<String>,
378 #[serde(default)]
380 pub cron_expression: Option<String>,
381 #[serde(default)]
383 pub is_enabled: Option<bool>,
384 #[serde(flatten)]
386 pub extra: Extra,
387}
388
389#[derive(Debug, Clone, Deserialize, Serialize)]
391#[serde(rename_all = "camelCase")]
392pub struct Webhook {
393 pub id: String,
395 #[serde(default)]
397 pub user_id: Option<String>,
398 #[serde(default)]
400 pub request_url: Option<String>,
401 #[serde(default)]
403 pub event_types: Vec<String>,
404 #[serde(flatten)]
406 pub extra: Extra,
407}
408
409#[derive(Debug, Clone, Deserialize, Serialize)]
411#[serde(rename_all = "camelCase")]
412pub struct WebhookDispatch {
413 pub id: String,
415 #[serde(default)]
417 pub webhook_id: Option<String>,
418 #[serde(flatten)]
420 pub extra: Extra,
421}
422
423#[derive(Debug, Clone, Deserialize, Serialize)]
425#[serde(rename_all = "camelCase")]
426pub struct User {
427 pub id: String,
429 #[serde(default)]
431 pub username: Option<String>,
432 #[serde(flatten)]
434 pub extra: Extra,
435}
436
437#[derive(Debug, Clone, Deserialize, Serialize)]
439#[serde(rename_all = "camelCase")]
440pub struct ActorStoreListItem {
441 pub id: String,
443 #[serde(default)]
445 pub name: Option<String>,
446 #[serde(default)]
448 pub username: Option<String>,
449 #[serde(default)]
451 pub title: Option<String>,
452 #[serde(flatten)]
454 pub extra: Extra,
455}
456
457#[derive(Debug, Clone, Deserialize, Serialize)]
459#[serde(rename_all = "camelCase")]
460pub struct ActorVersion {
461 pub version_number: String,
463 #[serde(default)]
465 pub source_type: Option<String>,
466 #[serde(flatten)]
468 pub extra: Extra,
469}
470
471#[derive(Debug, Clone, Deserialize, Serialize)]
473#[serde(rename_all = "camelCase")]
474pub struct ActorEnvVar {
475 pub name: String,
477 #[serde(default, skip_serializing_if = "Option::is_none")]
479 pub value: Option<String>,
480 #[serde(default, skip_serializing_if = "Option::is_none")]
482 pub is_secret: Option<bool>,
483 #[serde(flatten)]
485 pub extra: Extra,
486}