use crate::identity::{
AttemptNo, CommandId, DefinitionVersion, EffectId, SagaId, StepName, StepPhase, TenantId,
WorkflowName,
};
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SagaContext {
saga_id: SagaId,
tenant_id: TenantId,
workflow: WorkflowName,
definition_version: DefinitionVersion,
definition_digest: String,
step: StepName,
phase: StepPhase,
attempt: AttemptNo,
effect_id: EffectId,
target_phase: StepPhase,
target_effect_id: EffectId,
command_id: CommandId,
payload: Option<crate::SagaPayload>,
}
impl SagaContext {
#[allow(clippy::too_many_arguments)]
pub fn new(
saga_id: SagaId,
tenant_id: TenantId,
workflow: WorkflowName,
definition_version: DefinitionVersion,
definition_digest: impl Into<String>,
step: StepName,
phase: StepPhase,
attempt: AttemptNo,
) -> Self {
let effect_id = EffectId::derive(&saga_id, definition_version, &step, phase);
let command_id = CommandId::derive(&effect_id, attempt);
Self {
saga_id,
tenant_id,
workflow,
definition_version,
definition_digest: definition_digest.into(),
step,
phase,
attempt,
effect_id,
target_phase: phase,
target_effect_id: effect_id,
command_id,
payload: None,
}
}
pub fn with_payload(mut self, payload: Option<crate::SagaPayload>) -> Self {
self.payload = payload;
self
}
pub fn payload(&self) -> Option<&crate::SagaPayload> {
self.payload.as_ref()
}
pub fn with_target_phase(mut self, target_phase: StepPhase) -> Self {
self.target_effect_id = EffectId::derive(
&self.saga_id,
self.definition_version,
&self.step,
target_phase,
);
self.target_phase = target_phase;
self
}
pub fn saga_id(&self) -> &SagaId {
&self.saga_id
}
pub fn tenant_id(&self) -> &TenantId {
&self.tenant_id
}
pub fn workflow(&self) -> &WorkflowName {
&self.workflow
}
pub fn definition_version(&self) -> DefinitionVersion {
self.definition_version
}
pub fn definition_digest(&self) -> &str {
&self.definition_digest
}
pub fn step(&self) -> &StepName {
&self.step
}
pub fn phase(&self) -> StepPhase {
self.phase
}
pub fn attempt(&self) -> AttemptNo {
self.attempt
}
pub fn effect_id(&self) -> EffectId {
self.effect_id
}
pub fn target_phase(&self) -> StepPhase {
self.target_phase
}
pub fn target_effect_id(&self) -> EffectId {
self.target_effect_id
}
pub fn command_id(&self) -> CommandId {
self.command_id
}
}