Skip to main content

ExperimentStore

Trait ExperimentStore 

Source
pub trait ExperimentStore:
    Send
    + Sync
    + 'static {
    // Required methods
    fn get(
        &self,
        name: &str,
    ) -> Result<Option<ExperimentConfig>, ExperimentStoreError>;
    fn list(&self) -> Result<Vec<ExperimentConfig>, ExperimentStoreError>;
    fn upsert(
        &self,
        config: ExperimentConfig,
    ) -> Result<(), ExperimentStoreError>;
    fn set_state(
        &self,
        name: &str,
        state: ExperimentState,
        winner: Option<&str>,
    ) -> Result<(), ExperimentStoreError>;
    fn set_variants(
        &self,
        name: &str,
        variants: Vec<VariantConfig>,
        actor: Option<&str>,
    ) -> Result<(), ExperimentStoreError>;
    fn get_assignment(
        &self,
        experiment: &str,
        actor: &str,
    ) -> Result<Option<Assignment>, ExperimentStoreError>;
    fn record_assignment(
        &self,
        assignment: Assignment,
    ) -> Result<String, ExperimentStoreError>;
    fn get_override(
        &self,
        experiment: &str,
        actor: &str,
    ) -> Result<Option<String>, ExperimentStoreError>;
    fn set_override(
        &self,
        experiment: &str,
        actor: &str,
        variant: &str,
    ) -> Result<(), ExperimentStoreError>;
    fn has_assignment_in_group(
        &self,
        actor: &str,
        group: &str,
        exclude_experiment: &str,
    ) -> Result<bool, ExperimentStoreError>;
    fn history(
        &self,
        experiment: &str,
        limit: usize,
    ) -> Result<Vec<ChangeRecord>, ExperimentStoreError>;
}
Expand description

Pluggable storage backend for experiments.

All mutation methods should record an audit trail in the change log (accessible via history).

Required Methods§

Source

fn get( &self, name: &str, ) -> Result<Option<ExperimentConfig>, ExperimentStoreError>

Return the current configuration for name, or None if unknown.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn list(&self) -> Result<Vec<ExperimentConfig>, ExperimentStoreError>

Return all known experiments, sorted by name.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn upsert(&self, config: ExperimentConfig) -> Result<(), ExperimentStoreError>

Insert or update an experiment configuration.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn set_state( &self, name: &str, state: ExperimentState, winner: Option<&str>, ) -> Result<(), ExperimentStoreError>

Update the lifecycle state of an experiment.

Set winner when concluding; ignored otherwise.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn set_variants( &self, name: &str, variants: Vec<VariantConfig>, actor: Option<&str>, ) -> Result<(), ExperimentStoreError>

Update the variants and weights for an experiment.

Existing sticky assignments are NOT re-bucketed.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn get_assignment( &self, experiment: &str, actor: &str, ) -> Result<Option<Assignment>, ExperimentStoreError>

Return the sticky assignment for (experiment, actor), or None.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn record_assignment( &self, assignment: Assignment, ) -> Result<String, ExperimentStoreError>

Record a sticky assignment.

§Errors

Returns the variant that was persisted (the existing row’s variant on conflict, or the newly-inserted variant on first write). Callers must use this return value so that concurrent first-writers agree on the same sticky bucket.

Returns ExperimentStoreError on backend failure.

Source

fn get_override( &self, experiment: &str, actor: &str, ) -> Result<Option<String>, ExperimentStoreError>

Return the override variant name for (experiment, actor), or None.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn set_override( &self, experiment: &str, actor: &str, variant: &str, ) -> Result<(), ExperimentStoreError>

Pin actor to variant in experiment, bypassing weight-based bucketing.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn has_assignment_in_group( &self, actor: &str, group: &str, exclude_experiment: &str, ) -> Result<bool, ExperimentStoreError>

Return true if actor has an existing assignment in any experiment belonging to group, excluding exclude_experiment itself.

Used to enforce mutual exclusion: once an actor is in one experiment of a group, they are excluded from all siblings.

§Errors

Returns ExperimentStoreError on backend failure.

Source

fn history( &self, experiment: &str, limit: usize, ) -> Result<Vec<ChangeRecord>, ExperimentStoreError>

Return the change log for experiment (most-recent first), capped at limit entries. Returns an empty Vec for unknown experiments.

§Errors

Returns ExperimentStoreError on backend failure.

Dyn Compatibility§

This trait is dyn compatible.

In older versions of Rust, dyn compatibility was called "object safety".

Implementations on Foreign Types§

Source§

impl<T: ExperimentStore> ExperimentStore for Arc<T>

Source§

fn get( &self, name: &str, ) -> Result<Option<ExperimentConfig>, ExperimentStoreError>

Source§

fn list(&self) -> Result<Vec<ExperimentConfig>, ExperimentStoreError>

Source§

fn upsert(&self, config: ExperimentConfig) -> Result<(), ExperimentStoreError>

Source§

fn set_state( &self, name: &str, state: ExperimentState, winner: Option<&str>, ) -> Result<(), ExperimentStoreError>

Source§

fn set_variants( &self, name: &str, variants: Vec<VariantConfig>, actor: Option<&str>, ) -> Result<(), ExperimentStoreError>

Source§

fn get_assignment( &self, experiment: &str, actor: &str, ) -> Result<Option<Assignment>, ExperimentStoreError>

Source§

fn record_assignment( &self, assignment: Assignment, ) -> Result<String, ExperimentStoreError>

Source§

fn get_override( &self, experiment: &str, actor: &str, ) -> Result<Option<String>, ExperimentStoreError>

Source§

fn set_override( &self, experiment: &str, actor: &str, variant: &str, ) -> Result<(), ExperimentStoreError>

Source§

fn has_assignment_in_group( &self, actor: &str, group: &str, exclude_experiment: &str, ) -> Result<bool, ExperimentStoreError>

Source§

fn history( &self, experiment: &str, limit: usize, ) -> Result<Vec<ChangeRecord>, ExperimentStoreError>

Implementors§