use std::collections::HashMap; use serde::Deserialize; /// Top-level YAML file structure supporting both single and multi-workflow files. #[derive(Debug, Deserialize)] pub struct YamlWorkflowFile { /// Single workflow (backward compatible). pub workflow: Option, /// Multiple workflows in one file. pub workflows: Option>, } /// Legacy single-workflow top-level structure. Kept for backward compatibility /// with code that deserializes `YamlWorkflow` directly. #[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, /// Typed input schema: { field_name: type_string }. /// Example: `"repo_url": "string"`, `"tags": "list"`. #[serde(default)] pub inputs: HashMap, /// Typed output schema: { field_name: type_string }. #[serde(default)] pub outputs: HashMap, /// 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, // BuildKit fields pub dockerfile: Option, pub context: Option, pub target: Option, #[serde(default)] pub tags: Vec, #[serde(default)] pub build_args: HashMap, #[serde(default)] pub cache_from: Vec, #[serde(default)] pub cache_to: Vec, pub push: Option, pub buildkit_addr: Option, #[serde(default)] pub tls: Option, #[serde(default)] pub registry_auth: Option>, // Containerd fields pub image: Option, #[serde(default)] pub command: Option>, #[serde(default)] pub volumes: Vec, pub user: Option, pub network: Option, pub memory: Option, pub cpu: Option, pub pull: Option, pub containerd_addr: Option, /// CLI binary name for containerd steps: "nerdctl" (default) or "docker". pub cli: Option, // Workflow (sub-workflow) fields /// Child workflow ID (for `type: workflow` steps). #[serde(rename = "workflow")] pub child_workflow: Option, /// Child workflow version (for `type: workflow` steps). #[serde(rename = "workflow_version")] pub child_version: Option, } /// 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, } /// YAML-level TLS configuration for BuildKit steps. #[derive(Debug, Deserialize, Clone)] pub struct TlsConfigYaml { pub ca: Option, pub cert: Option, pub key: Option, } /// YAML-level registry auth configuration for BuildKit steps. #[derive(Debug, Deserialize, Clone)] pub struct RegistryAuthYaml { pub username: String, pub password: String, } /// YAML-level volume mount configuration for containerd steps. #[derive(Debug, Deserialize, Clone)] pub struct VolumeMountYaml { pub source: String, pub target: String, #[serde(default)] pub readonly: bool, } #[derive(Debug, Deserialize)] pub struct YamlErrorBehavior { #[serde(rename = "type")] pub behavior_type: String, pub interval: Option, pub max_retries: Option, }