Skip to main content

sema_core/runtime/
settlement.rs

1use 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}