Skip to main content

CascadeOutcome

Struct CascadeOutcome 

Source
#[non_exhaustive]
pub struct CascadeOutcome { pub resolved: usize, pub cascaded_children: usize, pub synchronous: bool, }
Expand description

Typed outcome of crate::engine_backend::EngineBackend::cascade_completion.

Observable result of cascading a terminal-execution completion into its downstream edges. Counters are best-effort — they describe what the backend actually did on this call, not an authoritative graph state (the dependency_reconciler remains the correctness safety net for both backends).

§Timing semantics

The two in-tree backends differ in when cascade work is observable to the caller. This is an accepted architectural divergence; consumer code that needs synchronous cascade either targets Valkey explicitly or inspects Postgres’s observability surface (outbox drain) to verify.

  • Valkey (synchronous = true): the FCALL cascade runs inline — when cascade_completion returns, every directly resolvable edge has been advanced and every child_skipped transitive descendant has been recursively cascaded up to the MAX_CASCADE_DEPTH cap. resolved + cascaded_children reflect the full subtree walked on this invocation.
  • Postgres (synchronous = false): the call enqueues a dispatch against the ff_completion_event outbox row; actual downstream ff_edge_group advancement is performed by ff_backend_postgres::dispatch::dispatch_completion in per-hop transactions. resolved is the number of edge groups advanced during this invocation’s outbox drain; cascaded_children is always 0 (PG does not self-recurse — further hops go through their own outbox events emitted by the completing transaction).

#[non_exhaustive] so additional counters (e.g. an explicit dispatched_event_id for PG, or a depth_reached for Valkey) can be added without breaking consumers.

Fields (Non-exhaustive)§

This struct is marked as non-exhaustive
Non-exhaustive structs could have additional fields added in future. Therefore, non-exhaustive structs cannot be constructed in external crates using the traditional Struct { .. } syntax; cannot be matched against without a wildcard ..; and struct update syntax will not work.
§resolved: usize

Edges whose resolution observably advanced on this call.

§cascaded_children: usize

Transitive descendants cascaded synchronously (Valkey only; always 0 on Postgres — see Timing semantics).

§synchronous: bool

true when the caller observed the cascade inline (Valkey); false when the call only enqueued dispatch (Postgres outbox).

Implementations§

Source§

impl CascadeOutcome

Source

pub fn synchronous(resolved: usize, cascaded_children: usize) -> Self

Construct an outcome describing a synchronous (Valkey) cascade.

Source

pub fn async_dispatched(advanced: usize) -> Self

Construct an outcome describing an async (Postgres outbox) dispatch. advanced is the per-call outbox-drain count.

Trait Implementations§

Source§

impl Clone for CascadeOutcome

Source§

fn clone(&self) -> CascadeOutcome

Returns a duplicate of the value. Read more
1.0.0 · Source§

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

Performs copy-assignment from source. Read more
Source§

impl Debug for CascadeOutcome

Source§

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

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

impl Default for CascadeOutcome

Source§

fn default() -> CascadeOutcome

Returns the “default value” for a type. Read more
Source§

impl PartialEq for CascadeOutcome

Source§

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

Tests for self and other values to be equal, and is used by ==.
1.0.0 · 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 Eq for CascadeOutcome

Source§

impl StructuralPartialEq for CascadeOutcome

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