use super::command::WorkflowCommand;
use super::mapreduce::MergeWorkflow;
use crate::cook::environment::{EnvProfile, SecretValue};
use serde::{Deserialize, Deserializer, Serialize};
use std::collections::HashMap;
use std::path::PathBuf;
#[derive(Debug, Clone, Serialize)]
pub struct WorkflowConfig {
#[serde(skip_serializing_if = "Option::is_none")]
pub name: Option<String>,
pub commands: Vec<WorkflowCommand>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env: Option<HashMap<String, String>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub secrets: Option<HashMap<String, SecretValue>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub env_files: Option<Vec<PathBuf>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub profiles: Option<HashMap<String, EnvProfile>>,
#[serde(skip_serializing_if = "Option::is_none")]
pub merge: Option<MergeWorkflow>,
}
impl<'de> Deserialize<'de> for WorkflowConfig {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: Deserializer<'de>,
{
#[derive(Deserialize)]
#[serde(untagged)]
#[allow(clippy::large_enum_variant)]
enum WorkflowConfigHelper {
Commands(Vec<WorkflowCommand>),
Full {
#[serde(default)]
name: Option<String>,
commands: Vec<WorkflowCommand>,
#[serde(default)]
env: Option<HashMap<String, String>>,
#[serde(default)]
secrets: Option<HashMap<String, SecretValue>>,
#[serde(default)]
env_files: Option<Vec<PathBuf>>,
#[serde(default)]
profiles: Option<HashMap<String, EnvProfile>>,
#[serde(default)]
merge: Option<MergeWorkflow>,
},
WithCommandsField {
#[serde(default)]
name: Option<String>,
commands: Vec<WorkflowCommand>,
},
}
let helper = WorkflowConfigHelper::deserialize(deserializer)?;
match helper {
WorkflowConfigHelper::Commands(cmds) => Ok(WorkflowConfig {
name: None,
commands: cmds,
env: None,
secrets: None,
env_files: None,
profiles: None,
merge: None,
}),
WorkflowConfigHelper::Full {
name,
commands,
env,
secrets,
env_files,
profiles,
merge,
} => Ok(WorkflowConfig {
name,
commands,
env,
secrets,
env_files,
profiles,
merge,
}),
WorkflowConfigHelper::WithCommandsField { name, commands } => Ok(WorkflowConfig {
name,
commands,
env: None,
secrets: None,
env_files: None,
profiles: None,
merge: None,
}),
}
}
}