Skip to content

Custom Flipping Strategy

A strategy is a fun interface, so a lambda is enough at runtime:

val goldOnly = FlippingStrategy { _, context -> context["tier"] == "gold" }
ff4k.features.put(Feature("vip-lounge", enabled = true, strategy = goldOnly))

To store the strategy in JSON or a persistent store, make it a @Serializable class with a @SerialName and register it in a SerializersModule that extends ff4kSerializersModule:

@Serializable
@SerialName("tier")
data class TierStrategy(val tiers: Set<String>) : FlippingStrategy {
    override suspend fun evaluate(feature: Feature, context: Map<String, Any>): Boolean =
        context["tier"]?.toString() in tiers
}

val json = Json {
    serializersModule = ff4kSerializersModule + SerializersModule {
        polymorphic(FlippingStrategy::class) { subclass(TierStrategy::class) }
    }
}

val configuration: FF4kConfiguration = json.decodeFromString(text)
val featureStore = SqliteFeatureStore(driver, json)

Custom strategies compose with the built-in ones: TierStrategy(setOf("gold")) and PercentageStrategy(50).