use crate::experiment::KeyValue;
use builder_pattern::Builder;
use chrono::Utc;
use serde::{Deserialize, Serialize};
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct CreateRun {
#[into]
pub experiment_id: String,
#[into]
pub run_name: String,
#[default(Utc::now().timestamp_millis())]
pub start_time: i64,
#[default(vec![])]
#[serde(default)]
pub tags: Vec<KeyValue>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct UpdateRun {
#[into]
pub run_id: String,
#[into]
pub experiment_id: String,
pub status: RunStatus,
#[default(Utc::now().timestamp_millis())]
pub end_time: i64,
#[default(None)]
pub run_name: Option<String>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct Run {
pub info: RunInfo,
pub data: RunData,
#[serde(default)]
pub inputs: RunInputs,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
pub struct RunInfo {
pub run_id: String,
pub run_name: String,
pub experiment_id: String,
pub status: RunStatus,
pub start_time: u64,
pub end_time: Option<u64>,
pub artifact_uri: String,
pub lifecycle_stage: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct RunData {
#[serde(default)]
#[default(vec![])]
pub metrics: Vec<Metric>,
#[serde(default)]
#[default(vec![])]
pub params: Vec<KeyValue>,
#[serde(default)]
#[default(vec![])]
pub tags: Vec<KeyValue>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum RunStatus {
Running,
Scheduled,
Finished,
Failed,
Killed,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct Metric {
#[into]
pub key: String,
#[into]
pub value: f64,
#[default(Utc::now().timestamp_millis())]
pub timestamp: i64,
pub step: u64,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
pub struct RunInputs {
#[serde(rename = "dataset_inputs", default)]
pub inputs: Vec<DataSetInput>,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct DataSetInput {
#[default(vec![])]
pub tags: Vec<KeyValue>,
pub dataset: DataSet,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct DataSet {
#[into]
pub name: String,
#[into]
pub digest: String,
#[into]
pub source_type: String,
#[into]
pub source: String,
#[into]
pub schema: String,
#[into]
pub profile: String,
}
#[derive(Clone, Debug, PartialEq, Serialize, Deserialize, Builder)]
pub struct SearchRuns {
#[into]
pub experiment_ids: Vec<String>,
#[into]
#[default("".to_owned())]
pub filter: String,
#[default(ViewType::default())]
pub view: ViewType,
#[default(None)]
#[serde(skip_serializing_if = "Option::is_none")]
pub max_results: Option<u16>,
#[into]
#[default(vec![])]
pub order_by: Vec<String>,
#[default(None)]
#[serde(skip_serializing_if = "Option::is_none")]
pub page_token: Option<String>,
}
#[derive(Clone, Debug, Default, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
pub enum ViewType {
#[default]
ActiveOnly,
DeletedOnly,
All,
}