use serde::{Deserialize, Serialize};
use super::{NotificationParams, PaginatedResult, Result};
use crate::macros::with_meta;
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum TaskStatus {
Working,
InputRequired,
Completed,
Failed,
Cancelled,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct TaskMetadata {
#[serde(skip_serializing_if = "Option::is_none")]
pub ttl: Option<u64>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RelatedTaskMetadata {
#[serde(rename = "taskId")]
pub task_id: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Task {
#[serde(rename = "taskId")]
pub task_id: String,
pub status: TaskStatus,
#[serde(rename = "statusMessage", skip_serializing_if = "Option::is_none")]
pub status_message: Option<String>,
#[serde(rename = "createdAt")]
pub created_at: String,
#[serde(rename = "lastUpdatedAt")]
pub last_updated_at: String,
pub ttl: Option<u64>,
#[serde(rename = "pollInterval", skip_serializing_if = "Option::is_none")]
pub poll_interval: Option<u64>,
}
#[with_meta]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CreateTaskResult {
pub task: Task,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskIdParams {
#[serde(rename = "taskId")]
pub task_id: String,
}
pub type GetTaskRequestParams = TaskIdParams;
pub type GetTaskPayloadRequestParams = TaskIdParams;
pub type CancelTaskRequestParams = TaskIdParams;
#[with_meta]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct GetTaskResult {
#[serde(flatten)]
pub task: Task,
}
pub type GetTaskPayloadResult = Result;
#[with_meta]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct CancelTaskResult {
#[serde(flatten)]
pub task: Task,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ListTasksResult {
#[serde(flatten)]
pub page: PaginatedResult,
pub tasks: Vec<Task>,
}
impl ListTasksResult {
pub fn new() -> Self {
Self {
page: PaginatedResult {
next_cursor: None,
_meta: None,
},
tasks: Vec::new(),
}
}
pub fn with_task(mut self, task: Task) -> Self {
self.tasks.push(task);
self
}
pub fn with_tasks(mut self, tasks: impl IntoIterator<Item = Task>) -> Self {
self.tasks.extend(tasks);
self
}
pub fn with_cursor(mut self, cursor: impl Into<super::Cursor>) -> Self {
self.page.next_cursor = Some(cursor.into());
self
}
}
impl Default for ListTasksResult {
fn default() -> Self {
Self::new()
}
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskStatusNotificationParams {
#[serde(flatten)]
pub notification: NotificationParams,
#[serde(flatten)]
pub task: Task,
}