
commonMain.FlagConfig.kt Maven / Gradle / Ivy
package com.amplitude.experiment.evaluation
import kotlin.native.concurrent.SharedImmutable
@SharedImmutable
const val DEFAULT_BUCKETING_KEY = "amplitude_id"
data class FlagConfig(
val flagKey: String,
val flagName: String,
val flagVersion: Int = 0,
val enabled: Boolean = false,
val bucketingKey: String = DEFAULT_BUCKETING_KEY,
val bucketingSalt: String? = null,
val useStickyBucketing: Boolean = false,
val globalHoldbackSalt: String? = null,
val globalHoldbackPct: Int = 0,
val mutualExclusionConfig: MutualExclusionConfig? = null,
val defaultValue: String? = null,
val variants: List,
val variantsExclusions: Map>?,
val variantsInclusions: Map>?,
val allUsersTargetingConfig: SegmentTargetingConfig, // TODO java code allows this to be null, only null in tests
val customSegmentTargetingConfigs: List?,
val userProperty: String?,
val evalMode: EvaluationMode = EvaluationMode.REMOTE,
) {
// TODO can this just be a constant?
val globalHoldbackBucketingKey = DEFAULT_BUCKETING_KEY
}
internal fun FlagConfig.getFullyRolledOutVariantIfPresent(): Variant? {
val totalAllocationPercentage: Int = allUsersTargetingConfig.allocations.sumOf { it.percentage }
if (totalAllocationPercentage < 10000) {
return null
}
// If a flag is rolled out to 100% and there's only one variant, return the variant
if (variants.size == 1) {
return variants[0]
}
val weights: Map = allUsersTargetingConfig.allocations[0].weights
?: return null
var fullyRolledOutVariant: Variant? = null
var variantsWithWeights = 0
for (variant in variants) {
if (weights[variant.key] ?: 0 > 0) {
fullyRolledOutVariant = variant
variantsWithWeights++
}
}
if (variantsWithWeights == 1) {
return fullyRolledOutVariant
}
return null
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy