pub enum SubscribeOutcome {
Live,
Deferred,
Dead {
node: NodeId,
},
}Expand description
Outcome of ProducerCtx::subscribe_to — the producer-layer
translation of graphrefly_core::SubscribeError into a positive
outcome enum that operators (zip / concat / race / take_until /
merge_map / switch_map / exhaust_map / concat_map) can match on for
per-operator dead-source semantics.
Introduced /qa F2 (2026-05-10) to close the silent-wedge class of
bugs where operators previously couldn’t tell that a subscribe_to
call had been rejected per R2.2.7.b (non-resubscribable terminal
source) — pre-F2 the rejection was logged-and-skipped silently,
which left zip waiting for a queue that would never fill, concat
stuck on a source that would never advance, etc.
Mirrors the per-domain status-string-union pattern used in TS
(RefineStatus, AgentStatus, process status: "running" | "completed" | "errored" | "cancelled") — each operator-layer
outcome lives in its own typed enum rather than sharing a global
Outcome<T, E> type.
Variants§
Live
Subscription installed successfully. The
ProducerNodeState holds the [Subscription]; no further
operator action required.
Deferred
Subscription was deferred to wave-end via the
graphrefly_core::DeferredProducerOp::Callback queue (Phase
H+ STRICT, D115). The deferred callback installs the
subscription after wave_guards release. Operators MAY treat
this as Live for lifecycle bookkeeping — the subscription
WILL be installed; just not yet.
Dead
The target node is non-resubscribable AND has terminated (R2.2.7.b, D118). The sink will NOT be installed. Operators MUST handle this per their semantics:
- zip / take_until (source): self-Complete (tuple stream can never form; take_until’s source is gone).
- concat: advance to the next source (treat as inner Complete signal).
- race: mark
completed[idx] = true; if all sources are Dead/Complete, self-Complete. - take_until (notifier): ignore (notifier signal will never fire; take_until reduces to a passthrough of source).
- switch_map / exhaust_map / concat_map / merge_map (inner):
treat as immediate
on_inner_complete— decrement active, advance to next, check self-Complete trigger.
Trait Implementations§
Source§impl Clone for SubscribeOutcome
impl Clone for SubscribeOutcome
Source§fn clone(&self) -> SubscribeOutcome
fn clone(&self) -> SubscribeOutcome
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for SubscribeOutcome
impl Debug for SubscribeOutcome
Source§impl PartialEq for SubscribeOutcome
impl PartialEq for SubscribeOutcome
Source§fn eq(&self, other: &SubscribeOutcome) -> bool
fn eq(&self, other: &SubscribeOutcome) -> bool
self and other values to be equal, and is used by ==.impl Copy for SubscribeOutcome
impl Eq for SubscribeOutcome
impl StructuralPartialEq for SubscribeOutcome
Auto Trait Implementations§
impl Freeze for SubscribeOutcome
impl RefUnwindSafe for SubscribeOutcome
impl Send for SubscribeOutcome
impl Sync for SubscribeOutcome
impl Unpin for SubscribeOutcome
impl UnsafeUnpin for SubscribeOutcome
impl UnwindSafe for SubscribeOutcome
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§impl<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.