use std::collections::HashMap;
use chrono::{DateTime, Utc};
use serde::{Deserialize, Serialize};
use serde_json::Value;
pub type Extra = HashMap<String, Value>;
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Actor {
pub id: String,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub description: Option<String>,
#[serde(default)]
pub is_public: Option<bool>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub modified_at: Option<DateTime<Utc>>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ActorRun {
pub id: String,
#[serde(default)]
pub act_id: Option<String>,
#[serde(default)]
pub actor_task_id: Option<String>,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub status_message: Option<String>,
#[serde(default)]
pub started_at: Option<DateTime<Utc>>,
#[serde(default)]
pub finished_at: Option<DateTime<Utc>>,
#[serde(default)]
pub build_id: Option<String>,
#[serde(default)]
pub default_dataset_id: Option<String>,
#[serde(default)]
pub default_key_value_store_id: Option<String>,
#[serde(default)]
pub default_request_queue_id: Option<String>,
#[serde(default)]
pub container_url: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
pub(crate) const TERMINAL_STATUSES: &[&str] =
&["SUCCEEDED", "FAILED", "ABORTED", "TIMED-OUT", "TIMED_OUT"];
impl ActorRun {
pub fn is_terminal(&self) -> bool {
self.status
.as_deref()
.map(|s| TERMINAL_STATUSES.contains(&s))
.unwrap_or(false)
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Build {
pub id: String,
#[serde(default)]
pub act_id: Option<String>,
#[serde(default)]
pub status: Option<String>,
#[serde(default)]
pub started_at: Option<DateTime<Utc>>,
#[serde(default)]
pub finished_at: Option<DateTime<Utc>>,
#[serde(default)]
pub build_number: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
impl Build {
pub fn is_terminal(&self) -> bool {
self.status
.as_deref()
.map(|s| TERMINAL_STATUSES.contains(&s))
.unwrap_or(false)
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Task {
pub id: String,
#[serde(default)]
pub act_id: Option<String>,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub modified_at: Option<DateTime<Utc>>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Dataset {
pub id: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub modified_at: Option<DateTime<Utc>>,
#[serde(default)]
pub item_count: Option<i64>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KeyValueStore {
pub id: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub modified_at: Option<DateTime<Utc>>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KeyValueStoreKey {
pub key: String,
#[serde(default)]
pub size: Option<i64>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct KeyValueStoreKeysPage {
#[serde(default)]
pub limit: i64,
#[serde(default)]
pub is_truncated: bool,
#[serde(default)]
pub exclusive_start_key: Option<String>,
#[serde(default)]
pub next_exclusive_start_key: Option<String>,
#[serde(default)]
pub items: Vec<KeyValueStoreKey>,
}
#[derive(Debug, Clone)]
pub struct KeyValueStoreRecord {
pub key: String,
pub value: Vec<u8>,
pub content_type: Option<String>,
}
impl KeyValueStoreRecord {
pub fn as_text(&self) -> Result<String, std::string::FromUtf8Error> {
String::from_utf8(self.value.clone())
}
pub fn json<T: serde::de::DeserializeOwned>(&self) -> Result<T, serde_json::Error> {
serde_json::from_slice(&self.value)
}
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestQueue {
pub id: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub created_at: Option<DateTime<Utc>>,
#[serde(default)]
pub modified_at: Option<DateTime<Utc>>,
#[serde(default)]
pub total_request_count: Option<i64>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestQueueRequest {
#[serde(default, skip_serializing_if = "Option::is_none")]
pub id: Option<String>,
pub url: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub unique_key: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub method: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub user_data: Option<Value>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestQueueOperationInfo {
pub request_id: String,
#[serde(default)]
pub was_already_present: bool,
#[serde(default)]
pub was_already_handled: bool,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct RequestQueueHead {
#[serde(default)]
pub limit: i64,
#[serde(default)]
pub had_multiple_clients: bool,
#[serde(default)]
pub items: Vec<RequestQueueRequest>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Schedule {
pub id: String,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub cron_expression: Option<String>,
#[serde(default)]
pub is_enabled: Option<bool>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct Webhook {
pub id: String,
#[serde(default)]
pub user_id: Option<String>,
#[serde(default)]
pub request_url: Option<String>,
#[serde(default)]
pub event_types: Vec<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct WebhookDispatch {
pub id: String,
#[serde(default)]
pub webhook_id: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct User {
pub id: String,
#[serde(default)]
pub username: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ActorStoreListItem {
pub id: String,
#[serde(default)]
pub name: Option<String>,
#[serde(default)]
pub username: Option<String>,
#[serde(default)]
pub title: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ActorVersion {
pub version_number: String,
#[serde(default)]
pub source_type: Option<String>,
#[serde(flatten)]
pub extra: Extra,
}
#[derive(Debug, Clone, Deserialize, Serialize)]
#[serde(rename_all = "camelCase")]
pub struct ActorEnvVar {
pub name: String,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub value: Option<String>,
#[serde(default, skip_serializing_if = "Option::is_none")]
pub is_secret: Option<bool>,
#[serde(flatten)]
pub extra: Extra,
}