use std::collections::HashMap; use serde::Deserialize; #[derive(Debug, Deserialize)] pub struct YamlWorkflow { pub workflow: WorkflowSpec, } #[derive(Debug, Deserialize)] pub struct WorkflowSpec { pub id: String, pub version: u32, #[serde(default)] pub description: Option, #[serde(default)] pub error_behavior: Option, pub steps: Vec, /// Allow unknown top-level keys (e.g. `_templates`) for YAML anchors. #[serde(flatten)] pub _extra: HashMap, } #[derive(Debug, Deserialize)] pub struct YamlStep { pub name: String, #[serde(rename = "type")] pub step_type: Option, #[serde(default)] pub config: Option, #[serde(default)] pub inputs: Vec, #[serde(default)] pub outputs: Vec, #[serde(default)] pub parallel: Option>, #[serde(default)] pub error_behavior: Option, #[serde(default)] pub on_success: Option>, #[serde(default)] pub on_failure: Option>, #[serde(default)] pub ensure: Option>, } #[derive(Debug, Deserialize, Clone)] pub struct StepConfig { pub run: Option, pub file: Option, pub script: Option, pub shell: Option, #[serde(default)] pub env: HashMap, pub timeout: Option, pub working_dir: Option, #[serde(default)] pub permissions: Option, #[serde(default)] pub modules: Vec, } /// YAML-level permission configuration for Deno steps. #[derive(Debug, Deserialize, Clone, Default)] pub struct DenoPermissionsYaml { #[serde(default)] pub net: Vec, #[serde(default)] pub read: Vec, #[serde(default)] pub write: Vec, #[serde(default)] pub env: Vec, #[serde(default)] pub run: bool, #[serde(default)] pub dynamic_import: bool, } #[derive(Debug, Deserialize)] pub struct DataRef { pub name: String, pub path: Option, pub json_path: Option, } #[derive(Debug, Deserialize)] pub struct YamlErrorBehavior { #[serde(rename = "type")] pub behavior_type: String, pub interval: Option, pub max_retries: Option, }