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§
Sourcefn get(
&self,
name: &str,
) -> Result<Option<ExperimentConfig>, ExperimentStoreError>
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.
Sourcefn list(&self) -> Result<Vec<ExperimentConfig>, ExperimentStoreError>
fn list(&self) -> Result<Vec<ExperimentConfig>, ExperimentStoreError>
Return all known experiments, sorted by name.
§Errors
Returns ExperimentStoreError on backend failure.
Sourcefn upsert(&self, config: ExperimentConfig) -> Result<(), ExperimentStoreError>
fn upsert(&self, config: ExperimentConfig) -> Result<(), ExperimentStoreError>
Insert or update an experiment configuration.
§Errors
Returns ExperimentStoreError on backend failure.
Sourcefn set_state(
&self,
name: &str,
state: ExperimentState,
winner: Option<&str>,
) -> Result<(), ExperimentStoreError>
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.
Sourcefn set_variants(
&self,
name: &str,
variants: Vec<VariantConfig>,
actor: Option<&str>,
) -> Result<(), ExperimentStoreError>
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.
Sourcefn get_assignment(
&self,
experiment: &str,
actor: &str,
) -> Result<Option<Assignment>, ExperimentStoreError>
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.
Sourcefn record_assignment(
&self,
assignment: Assignment,
) -> Result<String, ExperimentStoreError>
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.
Sourcefn get_override(
&self,
experiment: &str,
actor: &str,
) -> Result<Option<String>, ExperimentStoreError>
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.
Sourcefn set_override(
&self,
experiment: &str,
actor: &str,
variant: &str,
) -> Result<(), ExperimentStoreError>
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.
Sourcefn has_assignment_in_group(
&self,
actor: &str,
group: &str,
exclude_experiment: &str,
) -> Result<bool, ExperimentStoreError>
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.
Sourcefn history(
&self,
experiment: &str,
limit: usize,
) -> Result<Vec<ChangeRecord>, ExperimentStoreError>
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".