Skip to main content

LifespanScope

Struct LifespanScope 

Source
pub struct LifespanScope<T: Send + Sync + 'static> {
    pub state: T,
    /* private fields */
}
Expand description

Scope returned by a lifespan function containing state and cleanup logic.

The lifespan pattern allows sharing state between startup and shutdown phases, which is particularly useful for resources like database connections that need coordinated initialization and cleanup.

§Example

use fastapi_core::app::{App, LifespanScope, LifespanError};

struct DatabasePool { /* ... */ }

impl DatabasePool {
    async fn connect(url: &str) -> Result<Self, Error> { /* ... */ }
    async fn close(&self) { /* ... */ }
}

let app = App::builder()
    .lifespan(|| async {
        // Startup: connect to database
        let pool = DatabasePool::connect("postgres://localhost/mydb")
            .await
            .map_err(|e| LifespanError::with_source("failed to connect to database", e))?;

        // Clone for the cleanup closure
        let pool_for_cleanup = pool.clone();

        // Return state + cleanup
        Ok(LifespanScope::new(pool)
            .on_shutdown(async move {
                pool_for_cleanup.close().await;
            }))
    })
    .build();

Fields§

§state: T

State produced by the lifespan function.

This state is automatically added to the application’s state container and can be accessed by handlers via the State<T> extractor.

Implementations§

Source§

impl<T: Send + Sync + 'static> LifespanScope<T>

Source

pub fn new(state: T) -> Self

Creates a new lifespan scope with the given state.

The state will be added to the application’s state container after successful startup, accessible via the State<T> extractor.

§Example
let scope = LifespanScope::new(MyState { value: 42 });
Source

pub fn on_shutdown<F>(self, cleanup: F) -> Self
where F: Future<Output = ()> + Send + 'static,

Sets the cleanup future to run during application shutdown.

The cleanup runs in reverse order relative to other lifespan/shutdown hooks, after all in-flight requests have completed or been cancelled.

§Example
let scope = LifespanScope::new(pool.clone())
    .on_shutdown(async move {
        pool.close().await;
        println!("Database pool closed");
    });
Source

pub fn take_cleanup( &mut self, ) -> Option<Pin<Box<dyn Future<Output = ()> + Send>>>

Takes the cleanup future, leaving None in its place.

This is used internally to transfer the cleanup to the shutdown system.

Trait Implementations§

Source§

impl<T: Send + Sync + Debug + 'static> Debug for LifespanScope<T>

Source§

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

Formats the value using the given formatter. Read more

Auto Trait Implementations§

§

impl<T> Freeze for LifespanScope<T>
where T: Freeze,

§

impl<T> !RefUnwindSafe for LifespanScope<T>

§

impl<T> Send for LifespanScope<T>

§

impl<T> !Sync for LifespanScope<T>

§

impl<T> Unpin for LifespanScope<T>
where T: Unpin,

§

impl<T> !UnwindSafe for LifespanScope<T>

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