1use chrono::{DateTime, Utc};
2use serde::{Deserialize, Serialize};
3use std::collections::HashMap;
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
14pub struct DataResponse<T> {
15 pub data: T,
16}
17
18#[derive(Debug, Clone, Deserialize, Serialize)]
22pub struct ListResponse<T> {
23 pub data: ListData<T>,
24}
25
26#[derive(Debug, Clone, Deserialize, Serialize)]
28pub struct ListData<T> {
29 pub total: u64,
31 pub offset: u64,
33 pub limit: u64,
35 pub count: u64,
37 pub desc: bool,
39 pub items: Vec<T>,
41}
42
43#[derive(Debug, Clone, Deserialize, Serialize)]
54#[serde(rename_all = "camelCase")]
55pub struct Actor {
56 pub id: String,
57 pub user_id: String,
58 pub name: String,
59 pub username: String,
60 #[serde(skip_serializing_if = "Option::is_none")]
61 pub description: Option<String>,
62 pub is_public: bool,
63 pub created_at: DateTime<Utc>,
64 pub modified_at: DateTime<Utc>,
65 #[serde(skip_serializing_if = "Option::is_none")]
66 pub stats: Option<ActorStats>,
67 pub versions: Vec<ActorVersion>,
68 #[serde(skip_serializing_if = "Option::is_none")]
69 pub default_run_options: Option<RunOptions>,
70 #[serde(skip_serializing_if = "Option::is_none")]
71 pub title: Option<String>,
72 #[serde(skip_serializing_if = "Option::is_none")]
73 pub is_deprecated: Option<bool>,
74}
75
76#[derive(Debug, Clone, Deserialize, Serialize)]
78#[serde(rename_all = "camelCase")]
79pub struct ActorStats {
80 #[serde(skip_serializing_if = "Option::is_none")]
81 pub total_runs: Option<u64>,
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub last_run_started_at: Option<DateTime<Utc>>,
84}
85
86#[derive(Debug, Clone, Deserialize, Serialize)]
88#[serde(rename_all = "camelCase")]
89pub struct ActorVersion {
90 #[serde(skip_serializing_if = "Option::is_none")]
91 pub version_number: Option<String>,
92 #[serde(skip_serializing_if = "Option::is_none")]
93 pub source_type: Option<String>,
94 #[serde(skip_serializing_if = "Option::is_none")]
95 pub build_tag: Option<String>,
96}
97
98#[derive(Debug, Clone, Deserialize, Serialize)]
108#[serde(rename_all = "camelCase")]
109pub struct Task {
110 pub id: String,
111 pub user_id: String,
112 pub act_id: String,
113 pub name: String,
114 #[serde(skip_serializing_if = "Option::is_none")]
115 pub username: Option<String>,
116 pub created_at: DateTime<Utc>,
117 pub modified_at: DateTime<Utc>,
118 #[serde(skip_serializing_if = "Option::is_none")]
119 pub removed_at: Option<DateTime<Utc>>,
120 #[serde(skip_serializing_if = "Option::is_none")]
121 pub stats: Option<TaskStats>,
122 #[serde(skip_serializing_if = "Option::is_none")]
123 pub options: Option<TaskOptions>,
124 #[serde(skip_serializing_if = "Option::is_none")]
128 pub input: Option<serde_json::Value>,
129 #[serde(skip_serializing_if = "Option::is_none")]
130 pub title: Option<String>,
131}
132
133#[derive(Debug, Clone, Deserialize, Serialize)]
135#[serde(rename_all = "camelCase")]
136pub struct TaskStats {
137 #[serde(skip_serializing_if = "Option::is_none")]
138 pub total_runs: Option<u64>,
139}
140
141#[derive(Debug, Clone, Default, Deserialize, Serialize)]
145#[serde(rename_all = "camelCase")]
146pub struct TaskOptions {
147 #[serde(skip_serializing_if = "Option::is_none")]
149 pub build: Option<String>,
150 #[serde(skip_serializing_if = "Option::is_none")]
152 pub timeout_secs: Option<u64>,
153 #[serde(skip_serializing_if = "Option::is_none")]
155 pub memory_mbytes: Option<u64>,
156 #[serde(skip_serializing_if = "Option::is_none")]
158 pub max_items: Option<u64>,
159 #[serde(skip_serializing_if = "Option::is_none")]
161 pub max_total_charge_usd: Option<f64>,
162 #[serde(skip_serializing_if = "Option::is_none")]
164 pub restart_on_error: Option<bool>,
165}
166
167#[derive(Debug, Clone, Deserialize, Serialize)]
179#[serde(rename_all = "camelCase")]
180pub struct Run {
181 pub id: String,
182 pub act_id: String,
183 pub user_id: String,
184 #[serde(skip_serializing_if = "Option::is_none")]
186 pub actor_task_id: Option<String>,
187 pub started_at: DateTime<Utc>,
188 #[serde(skip_serializing_if = "Option::is_none")]
189 pub finished_at: Option<DateTime<Utc>>,
190 pub status: ActorJobStatus,
191 #[serde(skip_serializing_if = "Option::is_none")]
192 pub status_message: Option<String>,
193 #[serde(skip_serializing_if = "Option::is_none")]
194 pub is_status_message_terminal: Option<bool>,
195 #[serde(skip_serializing_if = "Option::is_none")]
196 pub meta: Option<RunMeta>,
197 #[serde(skip_serializing_if = "Option::is_none")]
198 pub stats: Option<RunStats>,
199 #[serde(skip_serializing_if = "Option::is_none")]
200 pub options: Option<RunOptions>,
201 pub build_id: String,
202 #[serde(skip_serializing_if = "Option::is_none")]
204 pub exit_code: Option<i32>,
205 pub default_key_value_store_id: String,
207 pub default_dataset_id: String,
209 pub default_request_queue_id: String,
211 #[serde(skip_serializing_if = "Option::is_none")]
212 pub storage_ids: Option<StorageIds>,
213 #[serde(skip_serializing_if = "Option::is_none")]
214 pub build_number: Option<String>,
215 #[serde(skip_serializing_if = "Option::is_none")]
217 pub container_url: Option<String>,
218 #[serde(skip_serializing_if = "Option::is_none")]
219 pub is_container_server_ready: Option<bool>,
220 #[serde(skip_serializing_if = "Option::is_none")]
221 pub git_branch_name: Option<String>,
222 #[serde(skip_serializing_if = "Option::is_none")]
224 pub usage_total_usd: Option<f64>,
225 #[serde(skip_serializing_if = "Option::is_none")]
226 pub charged_event_counts: Option<HashMap<String, u64>>,
227}
228
229#[derive(Debug, Clone, Deserialize, Serialize)]
231#[serde(rename_all = "camelCase")]
232pub struct RunMeta {
233 #[serde(skip_serializing_if = "Option::is_none")]
234 pub origin: Option<String>,
235 #[serde(skip_serializing_if = "Option::is_none")]
236 pub client_ip: Option<String>,
237 #[serde(skip_serializing_if = "Option::is_none")]
238 pub user_agent: Option<String>,
239}
240
241#[derive(Debug, Clone, Deserialize, Serialize)]
243#[serde(rename_all = "camelCase")]
244pub struct RunStats {
245 #[serde(skip_serializing_if = "Option::is_none")]
246 pub input_body_len: Option<u64>,
247 #[serde(skip_serializing_if = "Option::is_none")]
248 pub restart_count: Option<u64>,
249 #[serde(skip_serializing_if = "Option::is_none")]
250 pub resurrect_count: Option<u64>,
251 #[serde(skip_serializing_if = "Option::is_none")]
252 pub mem_avg_mbytes: Option<f64>,
253 #[serde(skip_serializing_if = "Option::is_none")]
254 pub mem_max_mbytes: Option<f64>,
255 #[serde(skip_serializing_if = "Option::is_none")]
256 pub cpu_avg_usage: Option<f64>,
257 #[serde(skip_serializing_if = "Option::is_none")]
258 pub cpu_max_usage: Option<f64>,
259 #[serde(skip_serializing_if = "Option::is_none")]
260 pub duration_millis: Option<u64>,
261 #[serde(skip_serializing_if = "Option::is_none")]
262 pub run_time_secs: Option<f64>,
263 #[serde(skip_serializing_if = "Option::is_none")]
264 pub metamorph: Option<u64>,
265 #[serde(skip_serializing_if = "Option::is_none")]
266 pub compute_units: Option<f64>,
267}
268
269#[derive(Debug, Clone, Default, Deserialize, Serialize)]
274#[serde(rename_all = "camelCase")]
275pub struct RunOptions {
276 #[serde(skip_serializing_if = "Option::is_none")]
277 pub build: Option<String>,
278 #[serde(skip_serializing_if = "Option::is_none")]
279 pub timeout_secs: Option<u64>,
280 #[serde(skip_serializing_if = "Option::is_none")]
281 pub memory_mbytes: Option<u64>,
282 #[serde(skip_serializing_if = "Option::is_none")]
283 pub max_items: Option<u64>,
284}
285
286#[derive(Debug, Clone, Deserialize, Serialize)]
288#[serde(rename_all = "camelCase")]
289pub struct StorageIds {
290 #[serde(skip_serializing_if = "Option::is_none")]
291 pub datasets: Option<HashMap<String, String>>,
292 #[serde(skip_serializing_if = "Option::is_none")]
293 pub key_value_stores: Option<HashMap<String, String>>,
294 #[serde(skip_serializing_if = "Option::is_none")]
295 pub request_queues: Option<HashMap<String, String>>,
296}
297
298#[derive(Debug, Clone, Copy, PartialEq, Eq, Deserialize, Serialize)]
305#[serde(rename_all = "SCREAMING-KEBAB-CASE")]
306pub enum ActorJobStatus {
307 Ready,
309 Running,
311 Succeeded,
313 Failed,
315 TimingOut,
317 TimedOut,
319 Aborting,
321 Aborted,
323}
324
325impl ActorJobStatus {
326 pub fn is_terminal(self) -> bool {
328 matches!(
329 self,
330 ActorJobStatus::Succeeded
331 | ActorJobStatus::Failed
332 | ActorJobStatus::TimedOut
333 | ActorJobStatus::Aborted
334 )
335 }
336
337 pub fn is_success(self) -> bool {
339 self == ActorJobStatus::Succeeded
340 }
341}
342
343#[derive(Debug, Clone, Deserialize, Serialize)]
349#[serde(rename_all = "camelCase")]
350pub struct ActorShort {
351 pub id: String,
352 #[serde(skip_serializing_if = "Option::is_none")]
353 pub name: Option<String>,
354 #[serde(skip_serializing_if = "Option::is_none")]
355 pub username: Option<String>,
356 pub created_at: DateTime<Utc>,
357 pub modified_at: DateTime<Utc>,
358}
359
360#[derive(Debug, Clone, Deserialize, Serialize)]
362#[serde(rename_all = "camelCase")]
363pub struct TaskShort {
364 pub id: String,
365 pub act_id: String,
366 pub name: String,
367 #[serde(skip_serializing_if = "Option::is_none")]
368 pub username: Option<String>,
369 pub created_at: DateTime<Utc>,
370 pub modified_at: DateTime<Utc>,
371}
372
373#[derive(Debug, Clone, Deserialize, Serialize)]
375#[serde(rename_all = "camelCase")]
376pub struct RunShort {
377 pub id: String,
378 pub act_id: String,
379 #[serde(skip_serializing_if = "Option::is_none")]
380 pub actor_task_id: Option<String>,
381 pub started_at: DateTime<Utc>,
382 #[serde(skip_serializing_if = "Option::is_none")]
383 pub finished_at: Option<DateTime<Utc>>,
384 pub status: ActorJobStatus,
385 #[serde(skip_serializing_if = "Option::is_none")]
386 pub build_id: Option<String>,
387}
388
389#[derive(Debug, Clone, Default, Serialize)]
395#[serde(rename_all = "camelCase")]
396pub struct ListParams {
397 #[serde(skip_serializing_if = "Option::is_none")]
399 pub offset: Option<u64>,
400 #[serde(skip_serializing_if = "Option::is_none")]
402 pub limit: Option<u64>,
403 #[serde(skip_serializing_if = "Option::is_none")]
405 pub desc: Option<bool>,
406}
407
408#[derive(Debug, Clone, Default, Serialize)]
412#[serde(rename_all = "camelCase")]
413pub struct RunParams {
414 #[serde(skip_serializing_if = "Option::is_none")]
416 pub build: Option<String>,
417 #[serde(skip_serializing_if = "Option::is_none")]
419 pub timeout_secs: Option<u64>,
420 #[serde(skip_serializing_if = "Option::is_none")]
422 pub memory_mbytes: Option<u64>,
423 #[serde(skip_serializing_if = "Option::is_none")]
425 pub max_items: Option<u64>,
426 #[serde(skip_serializing_if = "Option::is_none")]
428 pub max_total_charge_usd: Option<f64>,
429 #[serde(skip_serializing_if = "Option::is_none")]
432 pub wait_for_finish: Option<u64>,
433}
434
435#[derive(Debug, Clone, Serialize)]
437#[serde(rename_all = "camelCase")]
438pub struct CreateTaskRequest<T: Serialize> {
439 pub act_id: String,
441 #[serde(skip_serializing_if = "Option::is_none")]
442 pub name: Option<String>,
443 #[serde(skip_serializing_if = "Option::is_none")]
444 pub options: Option<TaskOptions>,
445 #[serde(skip_serializing_if = "Option::is_none")]
447 pub input: Option<T>,
448 #[serde(skip_serializing_if = "Option::is_none")]
449 pub title: Option<String>,
450}
451
452#[derive(Debug, Clone, Default, Serialize)]
457#[serde(rename_all = "camelCase")]
458pub struct UpdateTaskRequest<T: Serialize> {
459 #[serde(skip_serializing_if = "Option::is_none")]
460 pub name: Option<String>,
461 #[serde(skip_serializing_if = "Option::is_none")]
462 pub options: Option<TaskOptions>,
463 #[serde(skip_serializing_if = "Option::is_none")]
464 pub input: Option<T>,
465 #[serde(skip_serializing_if = "Option::is_none")]
466 pub title: Option<String>,
467}
468
469pub type DatasetItem = serde_json::Value;
474
475#[derive(Debug, Clone, Serialize, Deserialize)]
484pub struct InstagramActorInput {
485 pub usernames: Vec<String>,
489
490 #[serde(skip_serializing_if = "Option::is_none")]
493 pub results_limit: Option<u64>,
494
495 #[serde(skip_serializing_if = "Option::is_none")]
497 pub proxy_configuration: Option<ProxyConfiguration>,
498}
499
500#[derive(Debug, Clone, Serialize, Deserialize)]
514pub struct ProxyConfiguration {
515 #[serde(skip_serializing_if = "Option::is_none")]
517 pub use_apify_proxy: Option<bool>,
518
519 #[serde(skip_serializing_if = "Option::is_none")]
524 pub apify_proxy_groups: Option<Vec<String>>,
525
526 #[serde(skip_serializing_if = "Option::is_none")]
529 pub apify_proxy_country: Option<String>,
530}