sema_core/runtime/
settlement.rs1use crate::{SemaError, Value};
2
3use super::{CancelReason, SettlementSeq, Trace};
4use crate::cycle::GcEdge;
5
6#[derive(Debug)]
7pub enum TaskOutcome {
8 Returned(Value),
9 Failed(SemaError),
10 Cancelled(CancelReason),
11}
12
13#[derive(Debug)]
14pub struct TaskSettlement {
15 pub sequence: SettlementSeq,
16 pub outcome: TaskOutcome,
17}
18
19impl Trace for TaskOutcome {
20 fn trace(&self, sink: &mut dyn FnMut(GcEdge<'_>)) -> bool {
21 match self {
22 Self::Returned(value) => sink(GcEdge::Value(value)),
23 Self::Failed(error) => trace_error(error, sink),
24 Self::Cancelled(_) => {}
25 }
26 true
27 }
28}
29
30fn trace_error(error: &SemaError, sink: &mut dyn FnMut(GcEdge<'_>)) {
31 match error {
32 SemaError::UserException(value) | SemaError::Condition(value) => {
33 sink(GcEdge::Value(value));
34 }
35 SemaError::WithTrace { inner, .. } | SemaError::WithContext { inner, .. } => {
36 trace_error(inner, sink);
37 }
38 _ => {}
39 }
40}
41
42impl Trace for SemaError {
43 fn trace(&self, sink: &mut dyn FnMut(GcEdge<'_>)) -> bool {
44 trace_error(self, sink);
45 true
46 }
47}
48
49impl Trace for TaskSettlement {
50 fn trace(&self, sink: &mut dyn FnMut(GcEdge<'_>)) -> bool {
51 self.outcome.trace(sink)
52 }
53}