1use std::collections::HashMap;
10
11use chrono::{DateTime, Utc};
12use serde::{Deserialize, Serialize};
13use serde_json::Value;
14
15pub type Extra = HashMap<String, Value>;
17
18#[derive(Debug, Clone, Deserialize, Serialize)]
20#[serde(rename_all = "camelCase")]
21pub struct Actor {
22 pub id: String,
24 #[serde(default)]
26 pub user_id: Option<String>,
27 #[serde(default)]
29 pub name: Option<String>,
30 #[serde(default)]
32 pub username: Option<String>,
33 #[serde(default)]
35 pub title: Option<String>,
36 #[serde(default)]
38 pub description: Option<String>,
39 #[serde(default)]
41 pub is_public: Option<bool>,
42 #[serde(default)]
44 pub created_at: Option<DateTime<Utc>>,
45 #[serde(default)]
47 pub modified_at: Option<DateTime<Utc>>,
48 #[serde(flatten)]
50 pub extra: Extra,
51}
52
53#[derive(Debug, Clone, Deserialize, Serialize)]
55#[serde(rename_all = "camelCase")]
56pub struct ActorRun {
57 pub id: String,
59 #[serde(default)]
61 pub act_id: Option<String>,
62 #[serde(default)]
64 pub actor_task_id: Option<String>,
65 #[serde(default)]
67 pub user_id: Option<String>,
68 #[serde(default)]
70 pub status: Option<String>,
71 #[serde(default)]
73 pub status_message: Option<String>,
74 #[serde(default)]
76 pub started_at: Option<DateTime<Utc>>,
77 #[serde(default)]
79 pub finished_at: Option<DateTime<Utc>>,
80 #[serde(default)]
82 pub build_id: Option<String>,
83 #[serde(default)]
85 pub default_dataset_id: Option<String>,
86 #[serde(default)]
88 pub default_key_value_store_id: Option<String>,
89 #[serde(default)]
91 pub default_request_queue_id: Option<String>,
92 #[serde(default)]
94 pub container_url: Option<String>,
95 #[serde(flatten)]
97 pub extra: Extra,
98}
99
100pub(crate) const TERMINAL_STATUSES: &[&str] =
102 &["SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT", "TIMED_OUT"];
103
104impl ActorRun {
105 pub fn is_terminal(&self) -> bool {
107 self.status
108 .as_deref()
109 .map(|s| TERMINAL_STATUSES.contains(&s))
110 .unwrap_or(false)
111 }
112}
113
114#[derive(Debug, Clone, Deserialize, Serialize)]
116#[serde(rename_all = "camelCase")]
117pub struct Build {
118 pub id: String,
120 #[serde(default)]
122 pub act_id: Option<String>,
123 #[serde(default)]
125 pub status: Option<String>,
126 #[serde(default)]
128 pub started_at: Option<DateTime<Utc>>,
129 #[serde(default)]
131 pub finished_at: Option<DateTime<Utc>>,
132 #[serde(default)]
134 pub build_number: Option<String>,
135 #[serde(flatten)]
137 pub extra: Extra,
138}
139
140impl Build {
141 pub fn is_terminal(&self) -> bool {
143 self.status
144 .as_deref()
145 .map(|s| TERMINAL_STATUSES.contains(&s))
146 .unwrap_or(false)
147 }
148}
149
150#[derive(Debug, Clone, Deserialize, Serialize)]
152#[serde(rename_all = "camelCase")]
153pub struct Task {
154 pub id: String,
156 #[serde(default)]
158 pub act_id: Option<String>,
159 #[serde(default)]
161 pub user_id: Option<String>,
162 #[serde(default)]
164 pub name: Option<String>,
165 #[serde(default)]
167 pub title: Option<String>,
168 #[serde(default)]
170 pub created_at: Option<DateTime<Utc>>,
171 #[serde(default)]
173 pub modified_at: Option<DateTime<Utc>>,
174 #[serde(flatten)]
176 pub extra: Extra,
177}
178
179#[derive(Debug, Clone, Deserialize, Serialize)]
181#[serde(rename_all = "camelCase")]
182pub struct Dataset {
183 pub id: String,
185 #[serde(default)]
187 pub name: Option<String>,
188 #[serde(default)]
190 pub user_id: Option<String>,
191 #[serde(default)]
193 pub created_at: Option<DateTime<Utc>>,
194 #[serde(default)]
196 pub modified_at: Option<DateTime<Utc>>,
197 #[serde(default)]
199 pub item_count: Option<i64>,
200 #[serde(flatten)]
202 pub extra: Extra,
203}
204
205#[derive(Debug, Clone, Deserialize, Serialize)]
207#[serde(rename_all = "camelCase")]
208pub struct KeyValueStore {
209 pub id: String,
211 #[serde(default)]
213 pub name: Option<String>,
214 #[serde(default)]
216 pub user_id: Option<String>,
217 #[serde(default)]
219 pub created_at: Option<DateTime<Utc>>,
220 #[serde(default)]
222 pub modified_at: Option<DateTime<Utc>>,
223 #[serde(flatten)]
225 pub extra: Extra,
226}
227
228#[derive(Debug, Clone, Deserialize, Serialize)]
230#[serde(rename_all = "camelCase")]
231pub struct KeyValueStoreKey {
232 pub key: String,
234 #[serde(default)]
236 pub size: Option<i64>,
237 #[serde(flatten)]
239 pub extra: Extra,
240}
241
242#[derive(Debug, Clone, Deserialize, Serialize)]
244#[serde(rename_all = "camelCase")]
245pub struct KeyValueStoreKeysPage {
246 #[serde(default)]
248 pub limit: i64,
249 #[serde(default)]
251 pub is_truncated: bool,
252 #[serde(default)]
254 pub exclusive_start_key: Option<String>,
255 #[serde(default)]
257 pub next_exclusive_start_key: Option<String>,
258 #[serde(default)]
260 pub items: Vec<KeyValueStoreKey>,
261}
262
263#[derive(Debug, Clone)]
265pub struct KeyValueStoreRecord {
266 pub key: String,
268 pub value: Vec<u8>,
270 pub content_type: Option<String>,
272}
273
274impl KeyValueStoreRecord {
275 pub fn as_text(&self) -> Result<String, std::string::FromUtf8Error> {
277 String::from_utf8(self.value.clone())
278 }
279
280 pub fn json<T: serde::de::DeserializeOwned>(&self) -> Result<T, serde_json::Error> {
282 serde_json::from_slice(&self.value)
283 }
284}
285
286#[derive(Debug, Clone, Deserialize, Serialize)]
288#[serde(rename_all = "camelCase")]
289pub struct RequestQueue {
290 pub id: String,
292 #[serde(default)]
294 pub name: Option<String>,
295 #[serde(default)]
297 pub user_id: Option<String>,
298 #[serde(default)]
300 pub created_at: Option<DateTime<Utc>>,
301 #[serde(default)]
303 pub modified_at: Option<DateTime<Utc>>,
304 #[serde(default)]
306 pub total_request_count: Option<i64>,
307 #[serde(flatten)]
309 pub extra: Extra,
310}
311
312#[derive(Debug, Clone, Deserialize, Serialize)]
314#[serde(rename_all = "camelCase")]
315pub struct RequestQueueRequest {
316 #[serde(default, skip_serializing_if = "Option::is_none")]
318 pub id: Option<String>,
319 pub url: String,
321 #[serde(default, skip_serializing_if = "Option::is_none")]
323 pub unique_key: Option<String>,
324 #[serde(default, skip_serializing_if = "Option::is_none")]
326 pub method: Option<String>,
327 #[serde(default, skip_serializing_if = "Option::is_none")]
329 pub user_data: Option<Value>,
330 #[serde(flatten)]
332 pub extra: Extra,
333}
334
335#[derive(Debug, Clone, Deserialize, Serialize)]
337#[serde(rename_all = "camelCase")]
338pub struct RequestQueueOperationInfo {
339 pub request_id: String,
341 #[serde(default)]
343 pub was_already_present: bool,
344 #[serde(default)]
346 pub was_already_handled: bool,
347}
348
349#[derive(Debug, Clone, Deserialize, Serialize)]
351#[serde(rename_all = "camelCase")]
352pub struct RequestQueueHead {
353 #[serde(default)]
355 pub limit: i64,
356 #[serde(default)]
358 pub had_multiple_clients: bool,
359 #[serde(default)]
361 pub items: Vec<RequestQueueRequest>,
362 #[serde(flatten)]
364 pub extra: Extra,
365}
366
367#[derive(Debug, Clone, Deserialize, Serialize)]
369#[serde(rename_all = "camelCase")]
370pub struct Schedule {
371 pub id: String,
373 #[serde(default)]
375 pub user_id: Option<String>,
376 #[serde(default)]
378 pub name: Option<String>,
379 #[serde(default)]
381 pub cron_expression: Option<String>,
382 #[serde(default)]
384 pub is_enabled: Option<bool>,
385 #[serde(flatten)]
387 pub extra: Extra,
388}
389
390#[derive(Debug, Clone, Deserialize, Serialize)]
392#[serde(rename_all = "camelCase")]
393pub struct Webhook {
394 pub id: String,
396 #[serde(default)]
398 pub user_id: Option<String>,
399 #[serde(default)]
401 pub request_url: Option<String>,
402 #[serde(default)]
404 pub event_types: Vec<String>,
405 #[serde(flatten)]
407 pub extra: Extra,
408}
409
410#[derive(Debug, Clone, Deserialize, Serialize)]
412#[serde(rename_all = "camelCase")]
413pub struct WebhookDispatch {
414 pub id: String,
416 #[serde(default)]
418 pub webhook_id: Option<String>,
419 #[serde(flatten)]
421 pub extra: Extra,
422}
423
424#[derive(Debug, Clone, Deserialize, Serialize)]
426#[serde(rename_all = "camelCase")]
427pub struct User {
428 pub id: String,
430 #[serde(default)]
432 pub username: Option<String>,
433 #[serde(flatten)]
435 pub extra: Extra,
436}
437
438#[derive(Debug, Clone, Deserialize, Serialize)]
440#[serde(rename_all = "camelCase")]
441pub struct ActorStoreListItem {
442 pub id: String,
444 #[serde(default)]
446 pub name: Option<String>,
447 #[serde(default)]
449 pub username: Option<String>,
450 #[serde(default)]
452 pub title: Option<String>,
453 #[serde(flatten)]
455 pub extra: Extra,
456}
457
458#[derive(Debug, Clone, Deserialize, Serialize)]
460#[serde(rename_all = "camelCase")]
461pub struct ActorVersion {
462 pub version_number: String,
464 #[serde(default)]
466 pub source_type: Option<String>,
467 #[serde(flatten)]
469 pub extra: Extra,
470}
471
472#[derive(Debug, Clone, Deserialize, Serialize)]
474#[serde(rename_all = "camelCase")]
475pub struct ActorEnvVar {
476 pub name: String,
478 #[serde(default, skip_serializing_if = "Option::is_none")]
480 pub value: Option<String>,
481 #[serde(default, skip_serializing_if = "Option::is_none")]
483 pub is_secret: Option<bool>,
484 #[serde(flatten)]
486 pub extra: Extra,
487}