feat: plan typed action effects
This commit is contained in:
@@ -0,0 +1,56 @@
|
||||
class_name TransactionalActionEffectCommitter
|
||||
extends RefCounted
|
||||
|
||||
const REASON_INVALID_PLAN := &"invalid_effect_plan"
|
||||
const REASON_INVALID_CONTEXT := &"invalid_commit_context"
|
||||
const REASON_NOT_IMPLEMENTED := &"effect_committer_not_implemented"
|
||||
const REASON_INVALID_RESULT := &"invalid_commit_result"
|
||||
|
||||
|
||||
# This is the single public commit boundary. Implementations override only
|
||||
# _commit_whole_plan, apply every operation within one authority transaction,
|
||||
# and return success only after that transaction records its exact event IDs.
|
||||
# Any failure result promises that all partial writes were rolled back.
|
||||
func commit(plan: ActionEffectPlan, commit_context: Dictionary = {}) -> ActionEffectCommitResult:
|
||||
if plan == null or not plan.is_valid():
|
||||
return (
|
||||
ActionEffectCommitResult
|
||||
. rollback_safe_failure(
|
||||
REASON_INVALID_PLAN,
|
||||
"Effect plan is missing or invalid",
|
||||
[&"commit_rejected_before_authority", &"no_mutation_attempted"],
|
||||
)
|
||||
)
|
||||
if not ActionEffectPlan.is_primitive_record(commit_context):
|
||||
return (
|
||||
ActionEffectCommitResult
|
||||
. rollback_safe_failure(
|
||||
REASON_INVALID_CONTEXT,
|
||||
"Commit context must contain only primitive values",
|
||||
[&"commit_rejected_before_authority", &"no_mutation_attempted"],
|
||||
)
|
||||
)
|
||||
var result := _commit_whole_plan(plan, commit_context.duplicate(true))
|
||||
if result == null or not result.is_valid():
|
||||
return (
|
||||
ActionEffectCommitResult
|
||||
. rollback_safe_failure(
|
||||
REASON_INVALID_RESULT,
|
||||
"Atomic committer returned an invalid result",
|
||||
[&"commit_result_invalid", &"rollback_required"],
|
||||
)
|
||||
)
|
||||
return result
|
||||
|
||||
|
||||
func _commit_whole_plan(
|
||||
_plan: ActionEffectPlan, _commit_context: Dictionary
|
||||
) -> ActionEffectCommitResult:
|
||||
return (
|
||||
ActionEffectCommitResult
|
||||
. rollback_safe_failure(
|
||||
REASON_NOT_IMPLEMENTED,
|
||||
"No authoritative action-effect committer is configured",
|
||||
[&"commit_not_implemented", &"no_mutation_attempted"],
|
||||
)
|
||||
)
|
||||
Reference in New Issue
Block a user