Skip to content

Commit

Permalink
Consider targets for normal and experiment features
Browse files Browse the repository at this point in the history
  • Loading branch information
aitorvs committed Oct 11, 2024
1 parent 963fa24 commit 74e9bea
Show file tree
Hide file tree
Showing 3 changed files with 496 additions and 35 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -288,13 +288,29 @@ internal class ToggleImpl constructor(
private val forceDefaultVariant: () -> Unit,
) : Toggle {

private fun Toggle.State.isVariantTreated(variant: String?): Boolean {
// if no variants a present, we consider always treated
private fun Toggle.State.evaluateTargetMatching(isExperiment: Boolean): Boolean {
val variant = appVariantProvider.invoke()
// no targets then consider always treated
if (this.targets.isEmpty()) {
return true
}
// if it's an experiment we only check target variants and ignore all the rest
val variantTargets = this.targets.mapNotNull { it.variantKey }
if (isExperiment && variantTargets.isNotEmpty()) {
return variantTargets.contains(variant)
}
// finally, check all other targets
val countryTarget = this.targets.mapNotNull { it.localeCountry?.lowercase() }
val languageTarget = this.targets.mapNotNull { it.localeLanguage?.lowercase() }

if (countryTarget.isNotEmpty() && !countryTarget.contains(localeProvider.invoke()?.country?.lowercase())) {
return false
}
if (languageTarget.isNotEmpty() && !languageTarget.contains(localeProvider.invoke()?.language?.lowercase())) {
return false
}

return this.targets.mapNotNull { it.variantKey }.contains(variant)
return true
}

override fun featureName(): FeatureName {
Expand Down Expand Up @@ -334,10 +350,10 @@ internal class ToggleImpl constructor(
private fun isRolloutEnabled(): Boolean {
fun evaluateLocalEnable(state: State, isExperiment: Boolean): Boolean {
// variants are only considered for Experiment feature flags
val isVariantTreated = if (isExperiment) state.isVariantTreated(appVariantProvider.invoke()) else true
val doTargetsMatch = state.evaluateTargetMatching(isExperiment)

return state.enable &&
isVariantTreated &&
doTargetsMatch &&
appVersionProvider.invoke() >= (state.minSupportedVersion ?: 0)
}
// check if it should always be enabled for internal builds
Expand Down
Loading

0 comments on commit 74e9bea

Please sign in to comment.