use serde::{Deserialize, Serialize};
use serde_json::Value;
use super::ids::NodeId;
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum WorkflowKind {
#[serde(rename = "workflow.v1")]
WorkflowV1,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
pub enum NodeTypeV1 {
#[serde(rename = "llm.responses")]
LlmResponses,
#[serde(rename = "route.switch")]
RouteSwitch,
#[serde(rename = "join.all")]
JoinAll,
#[serde(rename = "join.any")]
JoinAny,
#[serde(rename = "join.collect")]
JoinCollect,
#[serde(rename = "transform.json")]
TransformJson,
#[serde(rename = "map.fanout")]
MapFanout,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "snake_case")]
pub enum ConditionSourceV1 {
NodeOutput,
NodeStatus,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
#[serde(rename_all = "lowercase")]
pub enum ConditionOpV1 {
Equals,
Matches,
Exists,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ConditionV1 {
pub source: ConditionSourceV1,
pub op: ConditionOpV1,
pub path: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub value: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct WorkflowSpecV1 {
pub kind: WorkflowKind,
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub execution: Option<ExecutionV1>,
#[serde(skip_serializing_if = "Option::is_none")]
pub inputs: Option<Vec<InputDeclV1>>,
pub nodes: Vec<NodeV1>,
#[serde(skip_serializing_if = "Option::is_none")]
pub edges: Option<Vec<EdgeV1>>,
pub outputs: Vec<OutputRefV1>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct InputDeclV1 {
pub name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub r#type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub required: Option<bool>,
#[serde(skip_serializing_if = "Option::is_none")]
pub description: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub default: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct ExecutionV1 {
#[serde(skip_serializing_if = "Option::is_none")]
pub max_parallelism: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub node_timeout_ms: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub run_timeout_ms: Option<i64>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct NodeV1 {
pub id: NodeId,
#[serde(rename = "type")]
pub node_type: NodeTypeV1,
#[serde(skip_serializing_if = "Option::is_none")]
pub input: Option<Value>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct EdgeV1 {
pub from: NodeId,
pub to: NodeId,
#[serde(skip_serializing_if = "Option::is_none")]
pub when: Option<ConditionV1>,
}
#[derive(Debug, Clone, Serialize, Deserialize, PartialEq)]
pub struct OutputRefV1 {
pub name: String,
pub from: NodeId,
#[serde(skip_serializing_if = "Option::is_none")]
pub pointer: Option<String>,
}
#[allow(dead_code)]
pub type Kind = WorkflowKind;
#[allow(dead_code)]
pub type SpecV1 = WorkflowSpecV1;