Skip to main content

CleanupStack

Struct CleanupStack 

Source
pub struct CleanupStack { /* private fields */ }
Expand description

Stack of cleanup functions to run after handler completion.

CleanupStack provides generator-style dependency lifecycle management similar to FastAPI’s yield dependencies. Cleanup functions are registered during dependency resolution and run in LIFO order after the handler completes, even on error or panic.

§Example

// Dependency with cleanup
impl FromDependencyWithCleanup for DbConnection {
    type Value = DbConnection;
    type Error = HttpError;

    async fn setup(ctx: &RequestContext, req: &mut Request)
        -> Result<(Self::Value, Option<CleanupFn>), Self::Error>
    {
        let conn = DbPool::get_connection().await?;
        let cleanup = {
            let conn = conn.clone();
            Box::new(move || {
                Box::pin(async move {
                    conn.release().await;
                }) as Pin<Box<dyn Future<Output = ()> + Send>>
            }) as CleanupFn
        };
        Ok((conn, Some(cleanup)))
    }
}

§Cleanup Order

Cleanup functions run in LIFO order (last registered runs first):

Setup order:   A -> B -> C
Cleanup order: C -> B -> A

This ensures that dependencies are cleaned up in the reverse order of their setup, maintaining proper resource lifecycle semantics.

Implementations§

Source§

impl CleanupStack

Source

pub fn new() -> Self

Create an empty cleanup stack.

Source

pub fn push(&self, cleanup: CleanupFn)

Register a cleanup function to run after handler completion.

Cleanup functions are run in LIFO order (last registered runs first).

Source

pub fn take_cleanups(&self) -> Vec<CleanupFn>

Take all cleanup functions for execution.

Returns cleanups in LIFO order (reversed from registration order). After calling this, the stack is empty.

Source

pub fn len(&self) -> usize

Returns the number of registered cleanup functions.

Source

pub fn is_empty(&self) -> bool

Returns true if no cleanup functions are registered.

Source

pub async fn run_cleanups(&self) -> usize

Run all cleanup functions in LIFO order.

This consumes all registered cleanup functions. Each cleanup is awaited in sequence. If a cleanup function panics (either during creation or execution), the remaining cleanups are still attempted.

§Returns

The number of cleanup functions that completed successfully.

Trait Implementations§

Source§

impl Debug for CleanupStack

Source§

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

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

impl Default for CleanupStack

Source§

fn default() -> Self

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

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> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, _span: NoopSpan) -> Self

Instruments this future with a span (no-op when disabled).
Source§

fn in_current_span(self) -> Self

Instruments this future with the current span (no-op when disabled).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
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, 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.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ResponseProduces<T> for T