use std::collections::BTreeMap;
use chrono::DateTime;
use chrono::Utc;
use crate::v1::types::task::Executor;
use crate::v1::types::task::Input;
use crate::v1::types::task::Output;
use crate::v1::types::task::Resources;
use crate::v1::types::task::State;
pub mod service_info;
pub use service_info::ServiceInfo;
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct CreatedTask {
pub id: String,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ListTasks<Task> {
pub tasks: Vec<Task>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub next_page_token: Option<String>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct OutputFile {
pub url: String,
pub path: String,
pub size_bytes: String,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct ExecutorLog {
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub start_time: Option<DateTime<Utc>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub end_time: Option<DateTime<Utc>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub stdout: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub stderr: Option<String>,
pub exit_code: i32,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct TaskLog {
pub logs: Vec<ExecutorLog>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub metadata: Option<serde_json::Value>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub start_time: Option<DateTime<Utc>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub end_time: Option<DateTime<Utc>>,
pub outputs: Vec<OutputFile>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub system_logs: Option<Vec<String>>,
}
#[derive(Clone, Debug, Default, Eq, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct MinimalTask {
pub id: String,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub state: Option<State>,
}
#[derive(Clone, Debug, Default, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Task {
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub id: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub state: Option<State>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub name: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub description: Option<String>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub inputs: Option<Vec<Input>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub outputs: Option<Vec<Output>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub resources: Option<Resources>,
pub executors: Vec<Executor>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub volumes: Option<Vec<String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub tags: Option<BTreeMap<String, String>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub logs: Option<Vec<TaskLog>>,
#[cfg_attr(feature = "serde", serde(skip_serializing_if = "Option::is_none"))]
pub creation_time: Option<DateTime<Utc>>,
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
#[cfg_attr(feature = "serde", serde(untagged))]
pub enum TaskResponse {
Minimal(MinimalTask),
Basic(Task),
Full(Task),
}
impl TaskResponse {
pub fn as_minimal(&self) -> Option<&MinimalTask> {
match self {
Self::Minimal(task) => Some(task),
_ => None,
}
}
pub fn into_minimal(self) -> Option<MinimalTask> {
match self {
Self::Minimal(task) => Some(task),
_ => None,
}
}
pub fn as_task(&self) -> Option<&Task> {
match self {
Self::Basic(task) | Self::Full(task) => Some(task),
_ => None,
}
}
pub fn into_task(self) -> Option<Task> {
match self {
Self::Basic(task) | Self::Full(task) => Some(task),
_ => None,
}
}
}