use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WorkflowConfig {
pub workflow: Workflow,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Workflow {
pub version: String,
#[serde(default)]
pub env: HashMap<String, String>,
#[serde(default)]
pub vars: HashMap<String, serde_yaml::Value>,
#[serde(default)]
pub template: Option<Template>,
pub tasks: Vec<Task>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Template {
pub id: String,
pub name: String,
pub version: String,
pub description: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Task {
pub task: TaskDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TaskDefinition {
pub id: String,
pub name: String,
pub description: String,
#[serde(default)]
pub actions: Vec<Action>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Action {
pub action: ActionDefinition,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct ActionDefinition {
pub id: String,
pub name: String,
pub description: String,
#[serde(default)]
pub flow: FlowControl,
#[serde(default)]
pub outputs: HashMap<String, serde_yaml::Value>,
#[serde(rename = "type")]
pub action_type: ActionType,
#[serde(default)]
pub parameters: HashMap<String, Parameter>,
}
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
pub struct FlowControl {
#[serde(default)]
pub next: Option<String>,
#[serde(default)]
pub next_if: Option<String>,
#[serde(default)]
pub while_util: Option<WhileUtil>,
#[serde(default)]
pub retry: Option<RetryConfig>,
#[serde(default)]
pub timeout: Option<TimeoutConfig>,
#[serde(default)]
pub on_error: Option<String>,
#[serde(default)]
pub on_timeout: Option<String>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct WhileUtil {
pub condition: String,
pub max_iterations: u32,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct RetryConfig {
pub max_retries: u32,
pub delay: u64, }
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct TimeoutConfig {
pub duration: u64, }
#[derive(Debug, Clone, Serialize, Deserialize, Default)]
#[serde(rename_all = "lowercase")]
pub enum ActionType {
Cmd,
Http,
#[default]
Builtin,
Wasm,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct Parameter {
pub value: serde_yaml::Value,
#[serde(default)]
pub required: bool,
}