Skip to main content

DbFeatureDriver

Struct DbFeatureDriver 

Source
#[non_exhaustive]
pub struct DbFeatureDriver { /* private fields */ }
Expand description

Feature flag driver backed by a database table rullst_feature_flags.

Uses a concurrent process-local cache with a configurable TTL. Lookup latency depends on contention, key/value size, hardware, and build profile.

§Note on Database Pool Initialization

This driver requires a live database pool to function. If feature flags are evaluated before the database connection pool has been initialized (e.g., in early application startup or static constructors), this driver will gracefully return None (falling through to subsequent drivers in the chain) rather than blocking or panicking.

Implementations§

Source§

impl DbFeatureDriver

Source

pub fn new() -> DbFeatureDriver

Creates a new DbFeatureDriver with a default cache TTL of 5 seconds.

Source

pub fn with_ttl(ttl: Duration) -> DbFeatureDriver

Creates a new DbFeatureDriver with a custom cache TTL duration. Overrides the default TTL.

Source

pub fn invalidate_process_cache()

Invalidates cached database flags in every DbFeatureDriver in this process.

Call this only after the corresponding database transaction commits. Other processes and direct database writers remain visible through the configured TTL unless the application distributes this signal itself.

Trait Implementations§

Source§

impl Default for DbFeatureDriver

Source§

fn default() -> DbFeatureDriver

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

impl FeatureDriver for DbFeatureDriver

Source§

fn enabled<'life0, 'life1, 'async_trait>( &'life0 self, flag: &'life1 str, ) -> Pin<Box<dyn Future<Output = Option<bool>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, DbFeatureDriver: 'async_trait,

Check if a feature flag is enabled.
Source§

fn enabled_for<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, flag: &'life1 str, identifier: &'life2 str, ) -> Pin<Box<dyn Future<Output = Option<bool>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, DbFeatureDriver: 'async_trait,

Check if a feature flag is enabled for a specific target identifier.
Source§

fn variant<'life0, 'life1, 'life2, 'async_trait>( &'life0 self, flag: &'life1 str, identifier: &'life2 str, ) -> Pin<Box<dyn Future<Output = Option<String>> + Send + 'async_trait>>
where 'life0: 'async_trait, 'life1: 'async_trait, 'life2: 'async_trait, DbFeatureDriver: 'async_trait,

Retrieve the variation name assigned to a specific target identifier.

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<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<A, B, T> HttpServerConnExec<A, B> for T
where B: Body,

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

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self> ⓘ

Converts self into a Left variant of Either<Self, Self> if into_left is true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self> ⓘ
where F: FnOnce(&Self) -> bool,

Converts self into a Left variant of Either<Self, Self> if into_left(&self) returns true. Converts self into a Right variant of Either<Self, Self> otherwise. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

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 = !

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

fn try_from(value: U) -> Result<T, !>

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<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

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