Skip to main content

SubscribeOutcome

Enum SubscribeOutcome 

Source
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.

Fields

§node: NodeId

The dead node that rejected the subscribe.

Trait Implementations§

Source§

impl Clone for SubscribeOutcome

Source§

fn clone(&self) -> SubscribeOutcome

Returns a duplicate of the value. Read more
1.0.0 (const: unstable) · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Debug for SubscribeOutcome

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl PartialEq for SubscribeOutcome

Source§

fn eq(&self, other: &SubscribeOutcome) -> bool

Tests for self and other values to be equal, and is used by ==.
1.0.0 (const: unstable) · Source§

fn ne(&self, other: &Rhs) -> bool

Tests for !=. The default implementation is almost always sufficient, and should not be overridden without very good reason.
Source§

impl Copy for SubscribeOutcome

Source§

impl Eq for SubscribeOutcome

Source§

impl StructuralPartialEq for SubscribeOutcome

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Checks if this value is equivalent to the given key. Read more
Source§

impl<Q, K> Equivalent<K> for Q
where Q: Eq + ?Sized, K: Borrow<Q> + ?Sized,

Source§

fn equivalent(&self, key: &K) -> bool

Compare self to key and return true if they are equal.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.