Skip to main content

monoloop_loop/transaction/lifecycle/
terminal.rs

1//! Terminal decision, proposals, and completion construction (v2 §13).
2
3use monoloop_contracts::{
4    CleanupStatus, TerminalEventDelivery, TransactionCompletion, TransactionEndEvent,
5    TransactionEndKind, TransactionId,
6};
7
8/// Immutable terminal decision selected once by the supervisor.
9#[derive(Clone, Debug, PartialEq, Eq)]
10pub struct TerminalDecision {
11    /// Selected end kind.
12    pub kind: TransactionEndKind,
13}
14
15impl TerminalDecision {
16    /// Construct a decision.
17    pub fn new(kind: TransactionEndKind) -> Self {
18        Self { kind }
19    }
20}
21
22/// Coordinator proposal — supervisor accepts or upgrades (Cancel→Terminated).
23#[derive(Clone, Debug, PartialEq, Eq)]
24pub struct TerminalProposal {
25    /// Proposed primary cause.
26    pub kind: TransactionEndKind,
27}
28
29impl TerminalProposal {
30    /// Construct a proposal.
31    pub fn new(kind: TransactionEndKind) -> Self {
32        Self { kind }
33    }
34}
35
36/// Build a completion mailbox payload.
37pub fn build_completion(
38    end: TransactionEndEvent,
39    terminal_event_delivery: TerminalEventDelivery,
40    cleanup: CleanupStatus,
41) -> TransactionCompletion {
42    TransactionCompletion {
43        end,
44        terminal_event_delivery,
45        cleanup,
46    }
47}
48
49/// Build a terminal event body.
50pub fn end_event(
51    transaction_id: TransactionId,
52    channel_id: monoloop_contracts::ChannelId,
53    session_id: Option<monoloop_contracts::SessionId>,
54    kind: TransactionEndKind,
55    emitted_events: u64,
56) -> TransactionEndEvent {
57    TransactionEndEvent {
58        transaction_id,
59        session_id,
60        channel_id,
61        kind,
62        emitted_events,
63        usage: monoloop_contracts::TransactionUsage::default(),
64        diagnostics: Vec::new(),
65    }
66}