use uuid::Uuid;
use super::super::identifiers::WorkflowType;
use super::build_validation::validate_workflow_enqueue;
use super::errors::WorkflowBuildError;
use super::types::{WorkflowRunEnqueue, WorkflowStepEnqueue};
#[derive(Debug, Clone)]
pub struct WorkflowRunEnqueueBuilder<'a> {
workflow_type: WorkflowType<'a>,
organization_id: Option<Uuid>,
metadata: &'a serde_json::Value,
idempotency_key: Option<&'a str>,
steps: Vec<WorkflowStepEnqueue<'a>>,
}
impl<'a> WorkflowRunEnqueueBuilder<'a> {
#[must_use]
pub fn new(workflow_type: WorkflowType<'a>, metadata: &'a serde_json::Value) -> Self {
Self {
workflow_type,
organization_id: None,
metadata,
idempotency_key: None,
steps: Vec::new(),
}
}
pub fn try_new(
workflow_type: &'a str,
metadata: &'a serde_json::Value,
) -> Result<Self, WorkflowBuildError> {
let workflow_type = WorkflowType::try_new(workflow_type)
.map_err(|_| WorkflowBuildError::BlankWorkflowType)?;
Ok(Self::new(workflow_type, metadata))
}
#[must_use]
pub fn organization_id(mut self, organization_id: Uuid) -> Self {
self.organization_id = Some(organization_id);
self
}
#[must_use]
pub fn clear_organization_id(mut self) -> Self {
self.organization_id = None;
self
}
#[must_use]
pub fn idempotency_key(mut self, idempotency_key: &'a str) -> Self {
self.idempotency_key = Some(idempotency_key);
self
}
#[must_use]
pub fn clear_idempotency_key(mut self) -> Self {
self.idempotency_key = None;
self
}
#[must_use]
pub fn step(mut self, step: WorkflowStepEnqueue<'a>) -> Self {
self.steps.push(step);
self
}
#[must_use]
pub fn set_steps(mut self, steps: impl IntoIterator<Item = WorkflowStepEnqueue<'a>>) -> Self {
self.steps = steps.into_iter().collect();
self
}
#[must_use]
pub fn extend_steps(
mut self,
steps: impl IntoIterator<Item = WorkflowStepEnqueue<'a>>,
) -> Self {
self.steps.extend(steps);
self
}
pub fn try_build(self) -> Result<WorkflowRunEnqueue<'a>, WorkflowBuildError> {
let workflow = WorkflowRunEnqueue {
workflow_type: self.workflow_type,
organization_id: self.organization_id,
metadata: self.metadata,
idempotency_key: self.idempotency_key,
steps: self.steps,
};
validate_workflow_enqueue(&workflow)?;
Ok(workflow)
}
}